一、
本文的写作理由
postgis插件一般是编译安装,编译安装的原因是可以选择自己喜欢的版本,但编译的难度也是比较高的,因为有各种依赖,依赖之间还有依赖,非常容易形成依赖循环,因此,失败率是比较高的
🆗,那么,假如我们有一组数据库服务器,都需要安装postgis插件,那么,是不是需要每台服务器都安装呢?比如,A,B,C三台数据库服务器,每个服务器上跑一个数据库实例的情况下
显然的,如果这一组服务器硬件配置基本一样,那么,我们应该是只需要编译在一台服务器上编译好postgis插件就可以了,剩下的postgis插件直接迁移过去就可以了,这也体现了 一次编译,随处运行的好处
比如,A,B,C 三个服务器都安装了postgresql12,但A服务器小版本是postgresql12.4,B服务器小版本是postgresql12.18,C服务器小版本是postgresql12.12,服务器都是centos7操作系统,服务器的硬件架构都是统一的x86_64,假设在A服务器上已经编译好了postgis3.4.3版本,那么,如何将编译好的postgis迁移到B和C服务器呢?
这里需要说明一下,postgis可以跨postgresql数据库的小版本但不可以跨大版本
下面我将以centos7的x86_64架构下的postgresql-12版本的postgis-3.4.3插件迁移做一个详细的说明
二、
相关迁移文件下载地址:
通过网盘分享的文件:postgis-3.4.3_pg12迁移
链接: https://pan.baidu.com/s/1H0wowsnmhxwR8hw7dfR6QQ?pwd=s8c7 提取码: s8c7
--来自百度网盘超级会员v6的分享
这里面都是postgis-3.4.3运行需要的各种依赖库文件,主要是一些so文件,已整理完成,可适用于所有pg12版本,也就是不细分小版本
三、
实验过程
1、
数据库的安装(简单记录)
yum install postgresql12-server-12.4 postgresql12-libs-12.4 postgresql12-devel-12.4 postgresql12-contrib-12.4 postgresql12-tcl postgresql12-odbc postgresql12-12.4 postgresql12-plperl-12.4 postgresql12-pltcl-12.4 postgresql12-plpython-12.4 postgresql12-plpython3-12.4 postgresql12-llvmjit-12.4 postgresql12-devel-12.4 -y
写入/etc/profile文件末尾:
PGDATA=/data/pgsql/data
export PGDATA
PGHOME=/data/pgsql
export PGHOME
PATH=$PATH:$PGHOME/bin:$PGDATA:/usr/pgsql-12/bin/
export PATH PGHOME PGDATA
postgres用户的环境变量修改:主要是PGDATA=/data/pgsql/data,其它不需要修改
cat /var/lib/pgsql/.bash_profile
[ -f /etc/profile ] && source /etc/profile
PGDATA=/data/pgsql/data
export PGDATA
# If you want to customize your settings,
# Use the file below. This is not overridden
# by the RPMS.
[ -f /var/lib/pgsql/.pgsql_profile ] && source /var/lib/pgsql/.pgsql_profile
创建自定义数据库的数据目录并赋权
mkdir -p /data/pgsql/
chown -Rf postgres. /data/pgsql
数据库启动脚本修改:
/usr/lib/systemd/system/postgresql-12.service
Environment=PGDATA=/var/lib/pgsql/12/data/
修改为
Environment=PGDATA=/data/pgsql/data/
初始化postgresql12数据库,并修改pg数据库的启动脚本名称,以方便使用:
/usr/pgsql-12/bin/postgresql-12-setup initdb
mv /usr/lib/systemd/system/postgresql-12.service /usr/lib/systemd/system/pg12.service
启动数据库
systemctl enable pg12
systemctl start pg12
2、ld文件搜寻配置
cat >/etc/ld.so.conf<<EOF
/usr/proj63/lib
/usr/local/lib64/
/usr/local/sfcgal/lib64/
/usr/gdal33/lib/
/usr/local/protobuf-c/lib
/usr/geos39/lib64/
/usr/ogdi41/lib/
/usr/libgeotiff17/lib/
/usr/pgsql-12/lib/
/usr/proj72/lib/
/usr/libspatialite43/lib/
/usr/lib64/mysql/
EOF
等下面步骤完成后,在运行ldconfig命令,以上所有命令都是在root下完成,不要切普通用户postgres
3、
解压所有压缩包
for i in `ls ./*.tar.gz` ;do tar xvf $i;done
4、
迁移文件的对应的放置位置
#备份数据库的插件目录
mv /usr/pgsql-12/share/extension{,.bak}
#使用编译好的正常可用的插件目录
mv /root/extension /usr/pgsql-12/share/
#备份数据库的lib目录
cp /usr/pgsql-12/lib{,.bak}
#移动编译好的postgis相关依赖库文件到系统依赖库
\cp -arf /root/usr/local/lib64/* /usr/local/lib64/
#移动postgis插件相关关键依赖,已编译好的
mv /root/usr/proj63 /usr/
mv /root/usr/proj72 /usr/
mv /root/usr/gdal33 /usr/
mv /root/usr/libgeotiff17 /usr/
mv /root/usr/libspatialite43 /usr/
mv /root/usr/ogdi41 /usr/
mv /root/usr/local/protobuf-c/ /usr/local/
mv /root/usr/local/sfcgal /usr/local/
#备份postgresql的关键依赖
mv /usr/pgsql-12/lib/bitcode{,.bak}
#pg数据库需要的依赖移动
mv -f /root/usr/pgsql-12/lib/bitcode /usr/pgsql-12/lib/
#所有postgis插件的so文件,这一步完成就可以在postgresql数据库内看到扩展列表了,但还没有激活
\cp -rvf usr/pgsql-12/lib/postgis* /usr/pgsql-12/lib/
#postgis插件的关键依赖so文件,这些文件是我一个个实验出来的
cp /root/usr/lib64/libpoppler.so.46 /usr/lib64/
cp /root/usr/lib64/libfreexl.so.1 /usr/lib64/
cp /root/usr/lib64/libwebp.so.4 /usr/lib64/
cp /root/usr/lib64/libxerces-c-3.1.so /usr/lib64/
cp /root/usr/lib64/libopenjp2.so.7 /usr/lib64/
cp /root/usr/lib64/libjasper.so.1 /usr/lib64/
cp /root/usr/lib64/libnetcdf.so.7 /usr/lib64/
cp /root/usr/lib64/libhdf5.so.8 /usr/lib64/
cp /root/usr/lib64/libgif.so.4 /usr/lib64/
cp /root/usr/lib64/libCharLS.so.1 /usr/lib64/
cp /root/usr/lib64/libgta.so.0 /usr/lib64/
cp /root/usr/lib64/libcfitsio.so.2 /usr/lib64/
cp /root/usr/lib64/libzstd.so.1 /usr/lib64/
cp /root/usr/lib64/libtiff.so.5 /usr/lib64/
cp /root/usr/lib64/libjpeg.so.62 /usr/lib64/
cp /root/usr/lib64/libdapclient.so.6 /usr/lib64/
cp /root/usr/lib64/libdapclient.so.7 /usr/lib64/
cp /root/usr/lib64/libdapserver.so.7 /usr/lib64/
cp /root/usr/lib64/libdap.so.17 /usr/lib64/
cp /root/usr/lib64/liblcms2.so.2 /usr/lib64/
cp /root/usr/lib64/libopenjpeg.so.1 /usr/lib64/
cp /root/usr/lib64/libfontconfig.so.1 /usr/lib64/
cp /root/usr/lib64/libhdf5_hl.so.8 /usr/lib64/
cp /root/usr/lib64/libsz.so.2 /usr/lib64/
cp /root/usr/lib64/libSM.so.6 /usr/lib64/
cp /root/usr/lib64/libICE.so.6 /usr/lib64/
cp /root/usr/lib64/libjbig.so.2.0 /usr/lib64/
cp /root/usr/lib64/libaec.so.0 /usr/lib64/
cp /root/usr/lib64/libX11.so.6 /usr/lib64/
cp /root/usr/lib64/libxcb.so.1 /usr/lib64/
cp /root/usr/lib64/libXau.so.6 /usr/lib64/
cp usr/pgsql-12/lib/address_standardizer-3.so /usr/pgsql-12/lib/
cp boost/* /usr/lib64/
#解决ldconfig命令的报错
mv /lib64/libboost_locale-mt.so.1.53.0 /lib64/libboost_locale-mt.so.1
ln -sf /lib64/libboost_locale-mt.so.1 /lib64/libboost_locale-mt.so.1.53.0
mv /lib64/libboost_atomic-mt.so.1.53.0 /lib64/libboost_atomic-mt.so.1
ln -sf /lib64/libboost_atomic-mt.so.1 /lib64/libboost_atomic-mt.so.1.53.0
最终postgis相关的插件应该是7个,如下所示:
postgres=# \dx
List of installed extensions
Name | Version | Schema | Description
------------------------------+---------+------------+---------------------------------------------------------------------------------------------------------------------
address_standardizer | 3.4.3 | public | Used to parse an address into constituent elements. Generally used to support geocoding address normalization step.
address_standardizer_data_us | 3.4.3 | public | Address Standardizer US dataset example
fuzzystrmatch | 1.1 | public | determine similarities and distance between strings
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
postgis | 3.4.3 | public | PostGIS geometry and geography spatial types and functions
postgis_raster | 3.4.3 | public | PostGIS raster types and functions
postgis_tiger_geocoder | 3.4.3 | tiger | PostGIS tiger geocoder and reverse geocoder
postgis_topology | 3.4.3 | topology | PostGIS topology spatial types and functions
(8 rows)
四、
常见错误处理
1、激活插件的时候报undefined symbol
postgres=# create extension postgis;
ERROR: could not load library "/usr/pgsql-12/lib/plpgsql.so": /usr/pgsql-12/lib/plpgsql.so: undefined symbol: EnsurePortalSnapshotExists
分析和解决:这个是激活postgis的时候遇到的,plpgsql.so 是pg数据库的最基本插件,那么,此报错表示的是版本不匹配,哪个版本呢?pg数据库的lib库版本不匹配,说简单点,比如,pg12.4和pg12.18 pg12.4用了pg12.18的lib,就会报这个错误,很简单,恢复lib库就可以了,也就是cp /usr/pgsql-12/lib{,.bak} 这个命令如果换成mv,那么需要恢复lib库,使用自己版本的就可以消除此错误了
2、
could not load library "/usr/pgsql-12/lib/postgis_raster-3.so"
postgres=# create extension postgis_raster ;
ERROR: could not load library "/usr/pgsql-12/lib/postgis_raster-3.so": libmysqlclient.so.18: cannot open shared object file: No such file or directory
分析和解决:
这个就比较简单了,在激活光栅插件的时候,找不到mysqlclient.so18 文件,find命令查找,可以发现此文件是存在的,在/usr/lib64/mysql 目录下的,因此,将此文件假如ld搜寻路径,也就是在/etc/ld.so.conf 文件内写入此路径告诉系统动态链接库在此路径下寻找就可以了
3、
server closed the connection unexpectedly
postgres=# create extension postgis_raster ;
server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
The connection to the server was lost. Attempting reset: Failed.
分析和解决:
这个错误也比较好解决,此错误是插件激活是有顺序的,虽然postgis_raster 这个插件已经有所有的动态链接库了,但它还依赖其它两个插件,因此,先激活其它插件,最后在激活此插件就可以了,其它两个插件是指的postgis_tiger_geocoder和postgis_topology
正确的激活顺序如下:
postgres=# create extension postgis;
CREATE EXTENSION
postgres=# create extension postgis_tiger_geocoder cascade;
NOTICE: installing required extension "fuzzystrmatch"
CREATE EXTENSION
postgres=# create extension postgis_topology ;
CREATE EXTENSION
postgres=# create extension postgis_raster ;
CREATE EXTENSION
postgres=# create extension address_standardizer;
CREATE EXTENSION
postgres=# create extension address_standardizer_data_us ;
CREATE EXTENSION