Issue 升級 PostgreSQL 9.1 的一個集群,由於該集群用到了 PostGIS,在升級 PostgreSQL 時也需要升級一下 PostGIS。PostGIS 相關軟體安裝好後,在 PostgreSQL 11 中創建 postgis extension 時失敗,如下: alvindb= ...
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