PostGIS 扩展创建失败原因调查

Issue

升级 PostgreSQL 9.1 的一个集群,由于该集群用到了 PostGIS,在升级 PostgreSQL 时也需要升级一下 PostGIS。PostGIS 相关软件安装好后,在 PostgreSQL 11 中创建 postgis extension 时失败,如下:

alvindb=# CREATE EXTENSION postgis;
ERROR:  could not load library "/data/pg11/lib/postgresql/postgis-x.x.so": /data/pg11/lib/postgresql/postgis-x.x.so: undefined symbol: GEOSClipByRect

Investigation

geos 是 PostGIS 的依赖包之一。通过 google 后怀疑是老版本 geos 的问题。

通过如下命令检查,确实是 geos 版本不一致。

# geos-config --version
3.x
# rpm -qa|grep geo
geos-3.y

通过定位 geos-config 绝对路径,可以确定 /usr/local/bin/geos-config 是旧版本的。

# whereis geos-config
geos-config: /usr/bin/geos-config /usr/local/bin/geos-config
# /usr/local/bin/geos-config --version
3.x
# /usr/bin/geos-config --version
3.y

通过 rpm 命令,得知旧版本 geos 并不是通过 rpm 命令安装的。

# rpm -q --whatprovides /usr/local/bin/geos-config
file /usr/local/bin/geos-config is not owned by any package
# rpm -q --whatprovides /usr/bin/geos-config
geos-3.y

将旧版本 geos rename 后,

# mv /usr/local/bin/geos-config /usr/local/bin/geos-config-x

重新进入命令行,显示正常版本

# geos-config --version
3.y

此时再创建 extension,仍然报错:

alvindb=# CREATE EXTENSION postgis;
ERROR:  could not load library "/data/pg11/lib/postgresql/postgis-x.x.so": /data/pg11/lib/postgresql/postgis-x.x.so: undefined symbol: GEOSClipByRect

Solution

经过一番周折之后,终于解决了。

在旧版本 geos 的源码目录,通过 make uninstall 卸载旧版本。

# cd geos-3.x
# make uninstall
...
 ( cd '/usr/local/include/geos/index/strtree' && rm -f AbstractNode.h AbstractSTRtree.h Boundable.h Interval.h ItemBoundable.h SIRtree.h STRtree.h )
...

查看新版本的 geos 相关文件,可知,虽然新老版本都安装在不同目录,还是会有影响的。

# rpm -ql geos-3.y|grep AbstractNode.h
/usr/include/geos/index/strtree/AbstractNode.h

此时再创建 extension,则成功了。

alvindb=# CREATE EXTENSION postgis;
CREATE EXTENSION

总结

生产环境安装软件时,也需要考虑到软件的升级与维护。源码安装会给管理软件带来一定程度的不便。

推荐进行统一配置管理(如 Ansible),使软件的管理与配置完全自动化。

发布者:糖太宗,转载请注明出处:https://www.qztxs.com/archives/science/technology/8281

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022年5月22日 下午4:04
下一篇 2022年5月22日 下午4:08

相关推荐

  • 我们从来都反对“大中台,小前台”的架构设计!

    在2020全球敏捷架构峰会上,快狗打车的架构师李洪英,分享了快狗打车业务中台的一些经验与思考。 画外音:PPT见文末。   问题一:什么是平台? 定义:一种基于外部供应商和顾客之间的价值创造互动的商业模式;它是规则和标准的制定者。   问题二:平台分为哪几类? (1)应用平台; (2)业务平台; (3)技术平台;   问题三:平台的价值在哪里? 于他:为所有...

    2022年5月15日
    2300
  • OpenCV识别滑块验证码缺口

    我们在利用爬虫采集数据时经常会碰到滑块验证码,下面我将通过OpenCV来识别滑块的缺口坐标。 一、Python3安装OpenCV 安装opencv可以用pip3来安装,命令如下: pip3 install opencv-python 如果在安装时碰到错误,可以安装下下面几个东西。 pip3 install scikit-build pip3 install ...

    2022年5月7日
    17300
  • 为什么微服务并不是越早越好?

    微服务架构,是分层架构演进过程中很重要的一环,那微服务是不是越早越好呢?今天和大家一起聊聊这一个问题。 什么时候进行DAO层的分层抽象? 最开始,分层架构长什么样? 一个业务系统最初的分层架构如上: (1)web-server层从db层获取数据并进行加工处理; (2)db层存储数据;   此时,web-server层如何获取底层的数据呢? web-serve...

    2022年5月14日
    2900
  • InnoDB,快照读,在RR和RC下有何差异?(很多人,以为自己懂了...)

    什么是快照读(Snapshot Read)? MySQL数据库,InnoDB存储引擎,为了提高并发,使用MVCC机制,在并发事务时,通过读取数据行的历史数据版本,不加锁,来提高并发的一种不加锁一致性读(Consistent Nonlocking Read)。 画外音:本文所有讨论基于MySQL-InnoDB。   快照读的内核原理,详见: 《InnoDB并发...

    技术 2022年5月10日
    2500
  • 7000字+24张图带你彻底弄懂线程池

    大家好。今天跟大家聊一聊无论是在工作中常用还是在面试中常问的线程池,通过画图的方式来彻底弄懂线程池的工作原理,以及在实际项目中该如何自定义适合业务的线程池。 一、什么是线程池 线程池其实是一种池化的技术的实现,池化技术的核心思想其实就是实现资源的一个复用,避免资源的重复创建和销毁带来的性能开销。在线程池中,线程池可以管理一堆线程,让线程执行完任务之后不会进行...

    2023年1月26日
    700

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信