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),使軟體的管理與配置完全自動化。

原文鏈接:
//www.cnblogs.com/dbadaily/p/postgis-issue.html
您瀏覽的網址與此鏈接不一致的話,則為未授權的轉載,為了更好的閱讀體驗,建議閱讀原文。

公眾號

關注 DBA Daily 公眾號,第一時間收到文章的更新。
通過一線 DBA 的日常工作,學習實用資料庫技術乾貨!

公眾號優質文章推薦

寫了一個簡單易用的 shell 框架

PostgreSQL VACUUM 之深入淺出

華山論劍之 PostgreSQL sequence

GitLab supports only PostgreSQL now

MySQL or PostgreSQL?

PostgreSQL hstore Insight