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.cnblogs.com/dbadaily/p/postgis-issue.html
您浏览的网址与此链接不一致的话,则为未授权的转载,为了更好的阅读体验,建议阅读原文。
公众号
关注 DBA Daily 公众号,第一时间收到文章的更新。
通过一线 DBA 的日常工作,学习实用数据库技术干货!
公众号优质文章推荐
GitLab supports only PostgreSQL now
PostGIS 扩展创建失败原因调查的更多相关文章
- mysql外键创建失败原因
引用:http://blog.csdn.net/wangpeng047/article/details/19624351 首先,如果和外键相关的几张表中已经插入了数据,可能导致外键插入的失败 在MyS ...
- mysql创建唯一索引UNIQUE INDEX,以及报错“#失败原因: [Execute: Duplicate entry '733186700' for key 'uniq_video_id_index']”
要给t_video_prods表的video_id字段创建唯一所以,可以使用下面这条语句: alter table t_video_prods add UNIQUE INDEX `uniq_video ...
- 【HANA系列】SAP ECLIPSE中创建ABAP项目失败原因解析
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP ECLIPSE中创建AB ...
- 玩转Windows服务系列——无COM接口Windows服务启动失败原因及解决方案
将VS创建的Windows服务项目编译生成的程序,通过命令行 “服务.exe -Service”注册为Windows服务后,就可以通过服务管理器进行管理了. 问题 通过服务管理器进行启动的时候,发现服 ...
- pip install 提示代理连接失败原因及解决办法
# pip install 提示代理连接失败原因及解决办法 1. 错误提示 在公司电脑上安装Python的虚拟环境时输入命令: pip install virtualenv 系统提示以下异常信息: R ...
- AVAudioplayer时error解决 创建失败 ERror creating player: Error Domain=NSOSStatusErrorDomain Code=2003334207 "(null)"
AVAudioplayer 有两个初始化方法: 1.[[AVAudioPlayer alloc] initWithData:musicData error&e]; 2.[[AVAudioPla ...
- Reactive native 项目创建失败如何处理
首先感谢党的英明决策. 一开始我总觉得Awesomeproject这个名字是固定的,和我有同感的同学请举手. 其实我们可以起任意的名字,执行native react init碰到的最大的问题是 npm ...
- service_names配置不正确,导致dg创建失败
service_names配置不正确,导致dg创建失败 伙伴发来消息,创建dg后,主备一直无法进行日志同步. 以下是查看过程 备库的alert日志: 2018-11-13T17:47:36.23129 ...
- 虚拟创建失败之Dbus调试
DBus调试命令 查询连接名 ### 查询所有连接名 # dbus-send --system --print-reply --dest=org.freedesktop.DBus / org.free ...
随机推荐
- 完美解决 scipy.misc.imread 报错 TypeError: Image data cannot be converted to float
File "/home/harrison/anaconda3/lib/python3.7/site-packages/matplotlib/image.py", line 634, ...
- String和int、long、double等基本数据类型的转换
学习目标: 掌握Java的基本数据类型与String的转换 学习内容: 1.转化规则 String 转 基本数据类型 基本数据类型 变量 = 包装类.Parse基本数据类型(String); // c ...
- 拼写检查-c++
[问题描述] 作为一个新的拼写检查程序开发团队的成员,您将编写一个模块,用已知的所有形式正确的词典来检查给定单词的正确性. 如果字典中没有这个词,那么可以用下列操作中的一个来替换正确的单 ...
- python---用顺序表实现队列
class Queue(object): """队列""" def __init__(self): self.__list = [] def ...
- 如何使用Android可视化埋点
Android可视化埋点是Android全埋点的增强.开发者可以将App界面同步至DTM界面,并在DTM界面通过可视化点击的方式添加埋点事件.目前Android可视化埋点包含两种埋点方式:普通可视化埋 ...
- Java学习day15
File是文件和目录路径名的抽象表示 文件和目录可以通过File封装成对象 对于File而言,封装的不是一个真正存在的文件,只是一个路径名,它可以存在,也可以不存在,要通过后续操作把路径的内容转换为具 ...
- 简单的js提示框,仅仅用jq和css就可以
首先定义一个盒子 1 .pop { 2 position: fixed; 3 top: 20%; 4 left: 50%; 5 transform: translate(-50%); 6 width: ...
- 2021.08.09 P5658 括号树(树形结构)
2021.08.09 P5658 括号树(树形结构) [P5658 CSP-S2019] 括号树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 太长,在链接中. 分析及代码 ...
- docker基础_docker镜像与分层
docker镜像与分层 docker镜像由一些松耦合的制度镜像层组成 docker负责堆叠这些镜像层并将它们表示为单个统一的对象 当 docker image pull ubuntu:latest 时 ...
- 终极套娃 2.0|云原生 PaaS 平台的可观测性实践分享
某个周一上午,小涛像往常一样泡上一杯热咖啡 ️,准备打开项目协同开始新一天的工作,突然隔壁的小文喊道:"快看,用户支持群里炸锅了 -" 用户 A:"Git 服务有点问题, ...