最近因为工作需要,在多个国产操作系统服务器上安装了postgresql11.5+postgis3.0.5(鲲鹏、统信uos,中标麒麟,银河麒麟),在整个过程中遇到了不少问题。
一路走来,虽说踩了各种奇奇怪怪的坑,但也的确学到了不少东西,在此总结记录一下安装过程和遇到的各种问题,给各位伙伴提供力所能及的帮助,也提供一些解决问题的思路。
全文尽可能多使用离线安装的方式(原谅我有些地方偷懒了,选择了在线安装)。
一、postgresql11.5安装
#进入到软件包存储目录
cd /home/
#解压安装包
tar -xjf postgresql-11.5.tar.bz2
#进入安装包所在目录
cd postgresql-11.5/
#开始安装配置
./configure
##以下为控制台输出结果
checking build system type... x86_64-pc-linux-gnu
checking host system type... x86_64-pc-linux-gnu
checking which template to use... linux
checking whether NLS is wanted... no
checking for default port number... 5432
checking for block size... 8kB
checking for segment size... 1GB
checking for WAL block size... 8kB
checking for gcc... no
checking for cc... no
configure: error: in `/home/postgre11.5/postgresql-11.5':
configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details
#提示$PATH中找不到可接受的C编译器
可能是系统自带的gcc版本太低或者系统没有安装gcc。
如果有外网环境,可以直接在线安装
yum install gcc
#继续编译postgresql
./configure
#提示找不到readline库
configure: error: readline library not found
If you have readline already installed, see config.log for details on the
failure. It is possible the compiler isn't looking in the proper directory.
Use --without-readline to disable readline support.
#需要安装readline
yum install readline-devel -y
可能会提示glibc32-2.20-7.2.x86_64 和 glibc-2.17-292.el7.ns7.02.i686冲突,导致readline无法安装(麒麟系统问题)
更新yum(过程会比较长,耐心等待)
yum update(麒麟系统才会遇到的问题)
继续编译postgresql
./configure
提示缺少zlib
configure: error: zlib library not found
If you have zlib already installed, see config.log for details on the
failure. It is possible the compiler isn't looking in the proper directory.
use --without-zlib to disable zlib support.
#安装zlib
yum install zlib-devel
继续编译postgresql(过程会比较长,耐心等待)
./configure
make
提示编译成功
开始安装
make install
postgresql被成功安装,并且根据输出信息可能看到postgresql被默认安装在/usr/local/pgsql目录下
#设置数据存储目录
mkdir -p /usr/local/pgsql/pgdata
#添加用户,并给权限改为postgres
useradd postgres
chown -R postgres:postgres /usr/local/pgsql/
#编辑环境变量文件
vim /etc/profile
#环境变量配置
export PATH=/usr/local/pgsql/bin:$PATH
LD_LIBRARY_PATH=/usr/local/pgsql/lib
export LD_LIBRARY_PATH
#重载配置让环境变量设置生效
source /etc/profile
#切换到postgres用户,并初始化数据库
su - postgres
initdb -D /usr/local/pgsql/pgdata
根据提示我们可以用以下命令启动服务
pg_ctl -D /usr/local/pgsql/pgdata -l logfile start
#设置数据库密码
切换到postgres用户:
su postgres
启动psql:
psql
执行修改密码的sql语句:
ALTER USER postgres WITH PASSWORD 'postgres';
设置远程连接
#需要修改PostgreSQL的连接参数,允许远程连接。
1、修改/usr/local/pgsql/pgdata/postgresql.conf
将#listen_addresses = 'localhost'修改成:listen_addresses = '*'
将#port = 5432修改成:port = 5432
2、修改/usr/local/pgsql/pgdata/pg_hba.conf
添加下列行
host all all 0.0.0.0/0 md5
postgresql.conf和pg_hba.conf文件是在做初始化数据库的时候自动生成的文件,如果不知道这两个配置文件在哪里,也可以使用以下命令查找文件位置。
find / -name postgresql.conf
find / -name pg_hba.conf
全局检索命令,使用find / -name *(*号表示文件全名)
数据库的启动,停止和重启
systemctl start postgresql
systemctl stop postgresql
systemctl restart postgresql
也可以用以下方法启动数据库。
su postgres
pg_ctl -D /usr/local/pgsql/pgdata -l logfile start
pg_ctl -D /usr/local/pgsql/pgdata -l logfile stop
pg_ctl -D /usr/local/pgsql/pgdata -l logfile restart
#设置开机自启动,并将postgresql添加系统服务
postgresql的自启动文件为postgresql/contrib/start-scripts编译目录下的linux文件
cp postgresql/contrib/start-scripts/linux /etc/rc.d/init.d/
将文件重命名为postgresql
mv /etc/rc.d/init.d/linux /etc/rc.d/init.d/postgresql
设置postgresql的安装目录和数据目录
# Installation prefix(数据库安装目录)
prefix=/usr/local/pgsql
# Data directory(数据库文件存储目录)
PGDATA="/usr/local/pgsql/pgdata"
加执行权限
chmod +x /etc/rc.d/init.d/postgresql
添加到服务
chkconfig --add postgresql
二、postgis3.0.5安装
1、安装libxml2-2.9.9
tar -xzvf libxml2-2.9.9.tar.gz
cd libxml2-2.9.9
./configure
make
make install
2、安装 geos-3.8.0
tar -xjf geos-3.8.0.tar.bz2
cd geos-3.8.0
./configure
make
make install
3、安装 proj-6.2.1
./configure
#提示sqlite3版本太低
#因为测试服务器有网络环境,所以此处直接在线安装
yum install sqlite-devel
tar -xzvf proj-6.2.1.tar.gz
cd proj-6.2.1
./configure
make
make install
4、安装gdal-3.3.3
tar -xzvf gdal-3.3.3.tar.gz
cd gdal-3.3.3
./configure()
make
make install
提示缺少jasper,导致无法安装gdal
5、安装jasper
tar -xzvf jasper-1.900.1.uuid.tar.gz
cd jasper-1.900.1.uuid
./configure --enable-shared
make
make install
我安装此依赖的时候都是默认安装,最开始没有加上生产动态链接库的参数,可以看到/usr/local/lib目录下没有生成动态链接文件,从而导致gdal无法成功被安装。
简单来讲, linux中,静态库的命名规则通常为lib*.a 动态库的命名通常是*.so
5、安装ogr-fdw-1.0.6
tar -xzf pgsql-ogr-fdw-1.0.6.tar.gz
cd /home/pgsql-ogr-fdw-1.0.6
make clean
make && make install
6、安装SFCGAL (可选)
6.1.安装cmake
unzip CMake-3.21.1.zip
cd CMake-3.21.1
make
make install
6.2.安装sfcgal 依赖 boost,cgal2.6.3.
#安装boost
yum -y install boost-devel
#安装cgal
tar -zxvf cgal-releases-CGAL-4.13.tar.gz
cd cgal-releases-CGAL-4.13
mkdir build && cd build
cmake ..
make
make install
#6.3可能出现缺少GMP和MPFR的情况,导致cgal无法被安装
cd /home/postgis/cgal-releases-CGAL-4.13/build
cmake ..
make
make install
安装GMP用以编译cgal
tar xvf gmp-6.2.1.tar
cd gmp-6.2.1
./configure
make && make install
安装MPFR用以编译cgal
tar -xzvf mpfr-4.1.0.tar.gz
cd mpfr-4.1.0
./configure
make && make install
7、安装fuzzystrmatch
cd /home/postgresql-11.5/contrib/fuzzystrmatch
make && make install
8、安装 postgis
./configure
make
make install
9、新建GIS扩展
CREATE EXTENSION postgis;
CREATE EXTENSION postgis_topology;
CREATE EXTENSION ogr_fdw;
CREATE EXTENSION postgis_raster;
CREATE EXTENSION postgis_sfcgal;
CREATE EXTENSION fuzzystrmatch;
CREATE EXTENSION address_standardizer;
CREATE EXTENSION address_standardizer_data_us;
CREATE EXTENSION postgis_tiger_geocoder;
注意:根据自身的业务需求,可选择性安装部分扩展。以上扩展不是必须全部安装的。
三、记录在创建GIS扩展时,可能会遇到的问题
问题1:找不到相关链接库文件1
#进入到缺少文件的目录下
cd /usr/local/pgsql/lib/
#查看缺少哪些依赖
ldd postgis-3.so
可以看到 libgeos_c.so.1和libproj.so.12是not found。
[root@linkgis lib]# find / -name libproj.so.12
/usr/local/lib/libproj.so.12
[root@linkgis lib]# find / -name libgeos_c.so.1
/usr/local/lib/libgeos_c.so.1
[root@linkgis lib]# cp /usr/local/lib/libproj.so.12 /usr/local/pgsql/lib/
[root@linkgis lib]# cp /usr/local/lib/libgeos_c.so.1 /usr/local/pgsql/lib/
问题 2: PostGIS二进制文件是使用与安装的版本不兼容的GEOS版本构建的,版本冲突导致无法创建扩展。
ERROR: could not load library "/usr/local/pgsql/lib/postgis-3.so": /usr/local/pgsql/lib/postgis-3.so: undefined symbol: GEOSCoordSeq_getXY
#根据提示进入相关目录
cd /usr/local/pgsql/lib/
#通过ldd命令,查看数据库正在使用哪个libgeos_c.so.1文件
ldd postgis-3.so
因为上面已经提示了geos的版本不兼容,所以找到服务器上已存在的libgeos_c.so.1文件,并删除所有的libgeos_c.so.1(这个文件是编译安装geos时自动生成的,无需担心无法恢复)。
查找服务器上是否还存在libgeos_c.so.1文件,如果还存在该文件,继续删除,直至找不到该文件为止。然后再用ldd postgis-3.so命令查看postgis引用文件已为not found。至此,已经完全删除了与postgis版本不兼容的文件。
ldd postgis-3.so
注:如果用我目录里面指定的版本不会出现这种问题。
./configure
make
make install
#使用命令查找安装geos后生成的libgeos_c.so.1文件,并将新生成的文件拷贝到相应目录下
find / -name libgeos_c.so.1
cp /usr/local/lib/libgeos_c.so.1 /usr/local/pgsql/lib/
今天安装aarch64架构服务器又遇到了一个新的坑
现象:创建postgis扩展的时候,一直提示缺这个文件,但是我安装postgis的时候提示读到这个版本了。并且我也把缺失的文件拷贝到了我对应的目录下。但是问题一直没得到解决。
最后求助华为工程师,最可以看一下华为工程师的解决思路。
帮我从新参照链接安装了geos和gdal,并且设置了环境变量,还给了相关目录更高的权限。解决了我的问题。