离线环境安装PostgreSQL、PostGIS
前言
在联网的Linux
环境上安装PostgreSQL
、PostGIS
,可能就是几句命令的事儿,相关的依赖可以自动安装,但是在离线的环境下安装,需要先编译安装各个依赖。
本文以麒麟服务器4.0.2
为测试环境,离线编译安装PostgreSQL 12.2
和PostGIS 3.0.5
。有联网的环境,安装方法请参考其他教程。
挂载本地源
因为是离线安装,所以此处将系统镜像挂载上,作为本地的镜像源,来安装一些基础包。注意镜像一定和系统对应上。
# 将麒麟系统镜像上传到系统里面任意位置,比如/root/iso路径下
# 编辑下方文件,注释掉其他无用的源,前面加上#即可
vim /etc/apt/sources.list
# 挂载镜像,注意此处一定要选择绝对路径,否则无法找到安装源
mount -o loop /root/iso/Kylin-4.0.2-desktop-sp2_Community-20171127-x86_64.iso /media/cdrom
# 添加镜像源
vim /etc/apt/sources.list
# 添加如下行
deb file:///mnt/cdrom juniper main
# 更新镜像源
apt-get update
安装基础的开发环境:
tasksel
# 选择开发环境,然后确定,系统会自动安装跟开发有关的相关包
安装基础库
apt-get install zlib1g-dev libreadline6-dev libssl-dev libxml2-dev
此处的坑
此处麒麟系统有两个坑,分别如下:
- 麒麟server版本的镜像里面缺少
zlib1g-dev
这个包,但是麒麟desktop里面包含这个包,所以需要把桌面版的镜像挂载上,当作apt
的源,从中安装依赖。然后再挂载server版的镜像,安装其他包。 libxml2-dev
这个包,安装后,执行下面的编译依赖步骤的时候可能会报找不到xml这个库,当时一直很纳闷,后来才找到原因。因为官方给的安装包里面有问题,安装包会建立软链接,如libxml2.so->libxml2.so.2->libxml2.so.2.9.3,应该是这种指向关系,但是官方给的包安装后指向了错误的so文件,需要自己手动删除然后创建软链接来修复错误。
创建用户
# 创建postgres用户
groupadd -g 701 postgres
useradd -g 701 -u 701 -s /bin/bash -m postgres
# 修改密码
passwd postgres
# 然后输入postgres用户的密码,回车
所需源码包、工具
libsystemd-dev_229-4ubuntu4_amd64.deb
cmake-3.20.1.tar.gz
postgresql-12.2.tar.gz
sqlite-autoconf-3380200.tar.gz
geos-3.8.1.tar.gz
proj-6.2.1.tar.gz
gdal-3.1.1.tar.gz
json-c-json-c-0.14-20200419.tar.gz
postgis-3.0.5.tar.gz
pgadmin4-6.8-x64.exe
相关安装包可自行Google搜索下载。也可从百度网盘下载:
链接:https://pan.baidu.com/s/1txTxd6xwHlx2-F_Ej8R4NQ
提取码:pgsq
安装步骤
所有操作均用root
用户进行,非root用户的操作我会特别注明su - postgres
。
安装PostgreSQL
安装并配置
安装
libsystemd-dev_229-4ubuntu4_amd64.deb
# 如果不需要systemd控制PostgreSQL的话,不用安装此包 # 此包在服务版和桌面版的系统iso镜像里面都没有找到,所以只能从网上下载了一个对应版本的Ubuntu的包 dpkg --force-depends -i libsystemd-dev_229-4ubuntu4_amd64.deb
编译安装
tar -xzvf postgresql-12.2.tar.gz cd postgresql-12.2 # 编译安装postgresql ./configure --with-systemd make -j$(nproc) make install # 编译安装contrib目录下的工具 cd ./contrib make -j$(nproc) make install
编辑环境变量
# 切换到postgres用户 su - postgres # 打开文件 vim ~/.bashrc # 在最下面添加如下行 export PG_HOME=/usr/local/pgsql export PATH=$PG_HOME/bin:/usr/local/bin:$PATH export LD_LIBRARY_PATH=$PG_HOME/lib:/usr/local/lib:$LD_LIBRARY_PATH export PGDATA=/home/postgres/pgdata export PGHOST=/tmp # 使文件生效 source ~/.bashrc
初始化数据库实例
# postgres用户执行 # 创建data文件夹 mkdir /home/postgres/pgdata # 初始化数据库实例 initdb # 启动数据库 pg_ctl -l logfile start
编辑数据库配置文件
# 切换到data目录下 cd /home/postgres/data/ # 编辑pg_hba.conf文件 vim pg_hba.conf # 在倒数第7行左右添加任意ip均可访问,其实添加的位置无所谓,最后一个字段如果为trust的话,则访问数据库不需要密码 host all all 0/0 md5 # 保存退出 # 编辑postgresql.conf文件 vim postgresql.conf # 修改监听地址,将改行的localhost修改为* listen_addresses = '*' # 将端口的注释放开 port = 5432 # 在/home/postgres/pgdata/postgresql.conf文件的最后增加以下命令行: unix_socket_directories = '/tmp' # 保存退出
重启数据库
pg_ctl restart
测试
以下测试方法,二选其一即可。终端测试简单,不用再安装其他工具。客户端测试需要安装GUI客户端pgAdmin
。
使用终端测试
# 测试连接,会进入psql的交互界面 psql # \l,查看所有的数据库 \l # \q,退出psql交互 \q
修改密码
使用psql终端登录
psql
修改postgres的密码
alter user postgres with password 'postgres';
- 以后使用客户端登录的话需要输入密码。
安装PostGIS及相关依赖
编译安装
编译
cmake
# 因为安装geos依赖cmake,所以必须要有cmake # 首先检查系统中现有的cmake版本 cmake --version # 如果系统中现有的cmake版本大于等于3.8,就可以跳过此步骤 # 因为默认cmake的版本较低,或者系统中没有cmake,则需要编译一个高版本 tar -xzvf cmake-3.20.1.tar.gz cd cmake-3.20.1 ./configure make -j$(nproc) make install # 将原来的低版本cmake备份,并创建软连接至高版本的cmake mv /usr/bin/cmake /usr/bin/cmake-bak ln -s /usr/local/bin/cmake /usr/bin/cmake
编译
geos
tar -xzvf geos-3.8.1.tar.gz cd geos-3.8.1 mkdir build cd build cmake .. make -j$(nproc) make install
编译
sqlite3
# proj依赖sqlite3 tar -xzvf sqlite-autoconf-3380200.tar.gz cd sqlite-autoconf-3380200 ./configure make -j$(nproc) make install
编译
proj
tar -xzvf proj-6.2.1.tar.gz cd proj-6.2.1 ./configure make -j$(nproc) make install
编译
gdal
tar -xzvf gdal-3.1.1.tar.gz cd gdal-3.1.1 ./configure make -j$(nproc) # 此处编译较慢,请耐心等待,我在笔记本上尝试,耗时41分钟左右。 make install
编译
json-c
tar -xzvf json-c-json-c-0.14-20200419.tar.gz cd json-c-json-c-0.14-20200419 mkdir build cd build cmake .. make -j$(nproc) make install
编译
protobuf-c
(可选)protobuf-c为可选项,如果需要使用ST_AsGeobuf等函数,则需要安装protobuf-c。因为protobuf-c又依赖protobuf,所以先编译安装protobuf,然后再安装protobuf-c。
# 编译安装protobuf tar -xzvf protobuf-all-3.20.1.tar.gz cd protobuf-3.20.1 ./configure make -j$(nproc) make install
编译安装protobuf-c:
# 编译安装protobuf-c tar -xzvf protobuf-c-1.4.1.tar.gz cd protobuf-c-1.4.1 ./configure make -j$(nproc) make install
编译
postgis
切记此处一定要最后再编译postgis,因为编译postgis的时候,会去搜索前面依赖的库,如果搜索到才会激活相关的特性,如果没有搜索到,则不激活相关的特性。
如果先编译了postgis,而后安装的依赖库,则postgis没有检测到,则不会激活相应的特性。解决此问题的最好的办法就是最后再覆盖编译一下postgis插件。
tar -xzvf postgis-3.0.5.tar.gz cd postgis-3.0.5 ./configure make -j$(nproc) make install
编辑动态库搜索路径
vim /etc/ld.so.conf # 在最下面添加 /usr/local/lib/ # 保存退出后,在终端执行 ldconfig
测试
使用终端测试
su - postgres psql # 创建数据库 create database gis; # 连接数据库 \c gis # 创建插件 create extension postgis; # 如果输出CREATE EXTENSION,证明postgis加载成功。 #退出 \q
使用客户端测试
GUI客户端
pgAdmin
的操作步骤和其它数据库客户端操作步骤大同小异。不再赘述。
配合systemd开机启动
先暂停postgresql
# 切换到postgres用户 su - postgres # 停止 pg_ctl -D /home/postgres/data/ -l /home/postgres/logfile stop
新增
postgresql.service
文件,保存在/etc/systemd/system/
路径下[Unit] Description=PostgreSQL database server Documentation=man:postgres(1) [Service] Type=notify User=postgres ExecStart=/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data ExecReload=/bin/kill -HUP $MAINPID KillMode=mixed KillSignal=SIGINT TimeoutSec=0 [Install] WantedBy=multi-user.target
启动
# 重新载入service配置文件 systemctl daemon-reload # 启动pgsql systemctl start postgresql.service # 开机自启动 systemctl enable postgresql.service
参考文档
- CentOS 7源码安装PostGIS(包含SFCGAL,PgRouting)
- CentOS 7 离线环境 PostgreSQL 12.2 编译安装 + PostGIS 3.0.1 编译安装 + 主从流复制配置
- [Starting the Database Server](