KingbaseES数据库安装PostGIS扩展GEOSUnaryunionPrec错误

发布时间 2023-09-19 18:46:05作者: KINGBASE研究院

一、问题现象:

KingbaseES V008R006C007B0012数据库集群安装PostGIS扩展插件报错。

create extension postgis;
ERROR: could not load iibrary "/opt/kingbase/cluster/kingbase/lib/postgis-3.so”:/opt/kingbase/cluster/kingbase/lib/postgis-3.so: undefined symbo1: GEOSUnaryunionPrec 

二、适用版本:

KingbaseES所有版本。

三、排查过程(在集群所有节点执行):

1.使用ldd查询postgis-3.so库文件依赖是否有异常

ldd信息:

[kingbase@localhost lib]$ cd /opt/kingbase/cluster/kingbase/1ib/ 
[kingbase@localhost lib]$ ldd postgis-3.so
1inux-vdso.so.1(0x00007ffecb16a000)
libm.so.6 => /lib64/libm.so.6 (0x00007fc3426d1000)
libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007fc34251e000)
libgeos_c.so.1=>/opt/kingbase/cluster/kingbase/lib/1ibgeos_c.so.1 (0x00007fc3422e8000)
libproj.so.13 =>/opt/kingbase/cluster/kingbase/lib/1ibproj.so.13 (0x00007fc34206c000)
libjson-c.so.2    /opt/kingbase/cluster/kingbase/lib/1ibjson-c.so.2 (0x00007fc341e60000)    
libprotobuf-c.so.1 =>/opt7kingbase/cluster/kingbase/lib/1ibprotobuf-c.so.1 (0x00007fc341c55000) 
libxml2.so.2 =>/opt/kingbase/cluster/kingbase/lib/1ibxm12.so.2 (0x00007fc341906000) 
libz.so.1 => /1ib64/libz.so.1 (0x00007fc3418ec000) 
libdl.so.2 =>/1ib64/libd1.so.2 (0x00007fc3418e7000)
libsfCGALd.so.1 =>/opt/kingbase/cluster/kingbase/lib/libsFCGALd.so.1 (0x00007fc33ee21000) 
libacc_s.so.1 => /lib64/1ibacc s.so.1 (0x00007fc33ee08000) 
libc.so.6 => /lib64/libc.so.6 (0x00007fc33ec47000)
/lib64/ld-1inux-x86-64.so.2 (0x00007fc342bf3000)
libgeos-3.9.1.so =>/opt/kingbase/cluster/kingbase/lib/1ibgeos-3.9.1.so(0x00007fc33e7de000) 
libpthread.so.0 => /1ib64/libpthread.so.o (0xo0007fc33e7bd60o)
libCGAL.so.12 =>/opt/kingbase/cluster/kingbase/lib/libcGAL.so.12 (0x00007fc33e53e000)
libcgal Core.so.12 =>/opt/kingbase/cluster/kingbase/lib/libcGAL_core.so.12 (0x00007fc33e28a000) 
libmpfr.so.6 => /opt/kingbase/cluster/kingbase/lib/libmpfr.so.6(0x00007fc33e010000)
libamp.so.10 =>    /opt/kingbase/cluster/kingbase/lib/libgmp.so.10    (0x00007fc33dd93000

经排查postgis-3.so库文件未发现异常。

2.KingbaseES数据库版本跟PostGIS版本不对应:

安装跟数据库不匹配的高版本PostGIS或者低版本的PostGIS也会导致类型的问题。

KingbaseES数据库版本:

 KingbaseES V008R006C007B0012 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-46), 64-bit

PostGIS扩展插件版本:

postgis-3.1.2_X86_V008R006C007B0012.tar.gz

经确认数据库版本跟PostGIS扩展插件版本对应。

3.系统存在其他版本的geos:

KingbaseES数据库PostGIS依赖geos都在数据库lib目录:

使用以下命令检查:

--rpm 命令
# rpm -qa  |  grep geo
geolite2 country 20181002 2.ky10.noarch
geocode-glib-devel-3.26.1-4.ky10.x86_64
geoclue2-2.5.6-1.p01.ky10.X86 64
geos-devel-3.6.1-12.oe1.x86 64
geocode-glib-help-3.26.1-4.ky10.noar ch
geos-3.6.1-12.oe1.X86_64
geoclue2-devel-2.5. 6-1.p01.ky10.x86_64
geocode-glib-3.26.1-4.KY10.X86 64
geolite2-city-20181002-2.ky10.noarch

--whereis geos-config
# whereis geos-config
geos-config:/usr/bin/geos-config /usr/1ocal/bin/geos-config
/usr/bin/geos-config --version
3.6.1
geos-config --version
3.7.0

经确认,当前系统包括数据库自带geos总共有3个不同版本的geos。

四、解决方法:

通过第三步排查过程,基本确定此问题是由于系统存在多个版本的geos导致。

1.通过设置环境变量指定使用的geos版本(推荐):

单独设置kingbase用户环境变量LD_LIBRARY_PATH指定使用跟数据库PostGIS版本匹配的geos:

--在.bashrc或者.bash_profile,添加以下环境变量保存退出
export LD_LIBRARY_PATH=/opt/kingbase/cluster/kingbase/1ib

添加LD_LIBRARY_PATH环境变量后执行以下命令:

source .bash_profile
--然后登录数据库再次执行
--此时执行以下命令创建成功
create extension postgis;

至此问题解决。

2.卸载系统安装的其他版本geos(不推荐):

使用rpm或者对应系统的命令,将系统whereis geos-config查询出来的geos都卸载或者删除。

删除后再次登录数据库进行PostGIS扩展插件的安装。