Centos7 编译安装PostgreSQL和PostGIS

2020-06-17 00:00:00 数据库 执行 目录 配置 安装

近的项目中使用PostgreSQL+ArcGISSDE 作为空间数据存储库,因此需要对PostgreSQL及其PostGIS了解。本编针对Centos7 下,使用源码的方式进行PostgreSQL和PostGIS的安装,及其对存在的相关问题进行探讨(采坑)(项目所在的是小云环境,无法连接网络,只能手动从代码撸了)。

一、Centos7下的PostgreSQL源码安装

1、安装环境要求

操作系统:Centos 7

需要的依赖:gcc、readline-devel、zlib-devel、python2.7、python-devel、libxml2-devel

PostgreSQL的源码:postgresql-9.5.10.tar.gz,可以从该网站下载:postgresql.org/ftp/sour

2、编译安装步骤

(1)、安装需要的依赖(好可以联网哦)

①、安装gcc:yum install gcc

②、安装readline-devel:yum install readline-devel

③、安装zlib-devel:yum install zlib-devel

④、安装python-devel:yum install python-devel

⑤、安装libxml2-devel:yum install libxml2-devel

(2)、PostgreSQL 源码的编译和安装


前戏:安装python2.7 和 libxml2 ,这两项都是基础的软件环境,都要安装上(能连上网络的,可以使用yum安装),我这里没有网络,只能从源码安装了。

先安装python2.7,从python.org/ftp/python/ 下载源码,上传到Centos ,解压,先执行 xz -d Python-2.7.9.tar.xz,然后执行 tar -vxf ./Python-2.7.9.tar,进入 Python-2.7.9,创建Python的安装目录,执行:mkdir /usr/local/python27,进行安装

./configure --prefix=/usr/local/python27
make
make install

再安装 libxml2,从这里下载 libxml2的源码 git.gnome.org/browse/li 将libxml2-2.9.7.tar 拷贝到Centos上,解压 ,进入 libxml2-2.9.7目录,运行 ./autogen.sh ,进行配置的验证,然后配置安装目录:./configure --prefix=/usr/local/libxml2 后执行make 和make install ,这样 libxml2 库就安装完成了


①、将postgresql-9.5.10.tar.gz上传至Centos7的 /opt目录下

②、解压 postgresql-9.5.10.tar.gz,到/opt (tar -zxvf ./postgresql-9.5.10.tar.gz),并进入解压后的目录 /opt/postgresql-9.5.10

③、可以使用./configure --help 查看编译相关的信息,--prefix=dir可以指定安装目录。另外,由于在PostgresSQL基础上安装SDE空间数据库,因此,编译的时候需要支持 XML ,先安装 libxml2库(等安装POSTGIS的时候也要安装这个),这里需要先设置一下编译安装的位置,我这边使用

./configure --prefix=/usr/local/PostgreSQL/9.5 --with-libxml --with-python

④、配置完成后,使用 make 进行编译,然后使用 make install 进行安装

(3)、PostgreSQL配置和初始化

PostgreSQL 安装完成后,接下来先要进行相关的配置。安装的权限是root 用户的,PostgreSQL 不能使用root用户启动,因此需要创建一个普通的账户,postgres 来启动PostgreSQL 。

①、创建普通的账户:postgres

执行命令:useradd postgres 创建用户

②、权限设置

需要将PostgreSQL 的数据目录的权限全部给postgres 账户。我这边安装的是在 /usr/local/PostgreSQL/9.5,数据目录打算存放在 /usr/local/PostgreSQL/9.5/data 中,另外,PostgreSQL启动时需要记录日志文件,因此在PostgreSQL 安装的根目录下创建一个log 目录,存放PostgreSQL 运行的日志信息(/usr/local/PostgreSQL/9.5/log), 因此执行下面的命令,创建日志目录log,并赋予数据目录权限

chown -R postgres:postgres /usr/local/PostgreSQL/9.5

③、环境变量配置

切换到postgres 用户,配置该用户的环境变量,执行 vi .bash_profile 追加以下内容

PGHOME=/usr/local/PostgreSQL/9.5
PGDATA=/usr/local/PostgreSQL/9.5/data
export PGHOME
export PGDATA
PATH =$PATH:$HOME/.local/bin:$HOME/bin:$PGHOME/bin
export PATH
然后执行 source ./.bash_profile 使其立即生效

可以使用 which psql 和 psql -V 查看PostgreSQL安装位置和其安装的版本

④、初始化PostgreSQL数据库

初始化PostgreSQL数据库,可以直接使用 initdb 命令。

使用 initdb --help 可以查看在初始化数据库时可以指定相关的参数,如数据存放的目录,指定的数据库编码、 指定数据的超级用户名和密码等。

如果初始化参数没有指定数据的存放目录,PostgreSQL将会使用配置中的指定的数据库存放目录。

如果看到以下信息,就表示PostgreSQL初始化数据库成功了

我们可以看下 /usr/local/PostgreSQL/9.5/data 目录下的相关数据和配置,base 是表空间目录,global目录是相关全局变量的目录

⑤、修改PostgreSQL的数据库的配置

在/usr/local/PostgreSQL/9.5/data目录下,有两个配置文件需要修改一下:pg_hba.conf和postgresql.conf

A、pg_hba.conf 是PostgreSQL的访问控制配置,默认的只能是主机访问,修改该配置文件,让客户端IP网段使其可以远程访问,我这里偷懒一下,把 127.0.0.1/32 修改为 0.0.0.0/0 ,然后将后面的 METHOD 修改为 md5, 让所有的客户端使用用户名密码访问。

B、postgresql.conf 配置是PostgreSQL全局数据库配置文件,该配置文件列出了PostgreSQL所有的外部配置相关的参数,这里关注一下 listen_addresses 将该项 取消注释(去掉前面的#),把其值“localhost” 修改为“*”,表示使其监听全部网络。PostgreSQL数据库默认的端口是 5432 ,可以修改端口号,port 项指定了端口号,修改完成后,注意在防火墙中开发该端口(我这边把Centos的防火墙卸载了)

到此为止 PostgreSQL数据库初始化和相关的配置已经全部完成,下面就可以直接启动PostgreSQL了

(4)、PostgreSQL启动

PostgreSQL启动使用以下命令:

pg_ctl start -l /usr/local/PostgreSQL/9.5/log/pg_server.log

后面的 -l 表示启动的日志目录,看到以下信息表示启动成功

也可以使用 ps -ef|grep postgres 查看一下是否存在PostgreSQL的相关进程

pg_ctl 命令-- 启动、停止、重启 PostgreSQL,该命令详细信息如下:
pg_ctl start [-w] [-s] [-D datadir] [-l filename] [-o options] [-p path]
pg_ctl stop [-W] [-s] [-D datadir] [-m s[mart] | f[ast] | i[mmediate] ]
pg_ctl restart [-w] [-s] [-D datadir] [-m s[mart] | f[ast] | i[mmediate] ] [-o options]
pg_ctl reload [-s] [-D datadir]
pg_ctl status [-D datadir]
pg_ctl kill [signal_name] [process_id]
pg_ctl register [-N servicename] [-U username] [-P password] [-D datadir] [-w] [-o options]
pg_ctl unregister [-N servicename]

PostgreSQL启动后,我们使用psql 连接进去,给数据库设置登录密码

输入: psql 进入 互交模式,输入 \password 会提示输入两次新的密码,完成后可以使用 \l 查看数据库列表

后,在客户机上可以使用 Navicat for PostgreSQL 或者 pgAdmin 4 连接我们创建的PostgreSQL数据库。

到此为止,Centos7下源码安装PostgreSQL 就算完成了。下节介绍从源码安装PostGIS。

使用ArcMap 直接连接PostgreSQL 创建企业级地理数据库,还需要一步设置,在arcGIS Desktop 的安装目录中 找到 st_geometry.so (该文件在...\Desk0.5\DatabaseSupport\PostgreSQL\9.5\Linux64),把这个文件上传拷贝到 /usr/local/PostgreSQL/9.5/lib/postgresql 目录下,注意不是lib 目录哦, 是 lib 目录下的 postgresql 目录,然后启动ArcMap ,创建企业级地理数据库:


二、Centos7下的PostGIS源码安装

PostGIS 是PostgreSQL的一个扩展插件,可以支持空间数据的存储

1、依赖安装,依赖有 proj.4 、json-c、geos、gdal、libxml2

(1)、proj 安装

将proj-4.9.3上传至Centos的opt目录下,解压,执行

./configure --prefix=/usr/local/proj

make

make install

(2)、json-c安装

从git 下载json-c-master.zip ,上传至Centos 的/opt/目录下,使用 unzip 解压,进入 json-c-master 目录

执行 以下命令:

./autogen.sh

./configure --prefix=/usr/local/proj

make

make install

(3)、geos安装

将geos-3.6.2.tar.bz2上传至Centos的/opt 目录下,使用命令 tar -xjf geos-3.6.2.tar.bz2 解压,进入 geos-3.6.2,执行以下命令进行编译安装:

./configure --prefix=/usr/local/geos

make

make install

(4)、gdal安装

将gdal-2.2.3.tar.gz 上传至Centos 的/opt 目录下,解压后,进入目录,执行以下命令进行编译安装

./autogen.sh

./configure --prefix=/usr/local/gdal --with-python=yes --with-java=yes

make

make install

(5)、libxml2安装

libxml2 在安装PostgreSQL 的时候已经安装

2、编译安装PostGIS模块

(1)、将PostGIS 源码包postgis-2.3.6.tar.gz上传至Centos 7的/opt 目录下,解压,进入 postgis-2.3.6

(2)、./configure --help 查看编译环境设置

(3)、执行下面目录

./configure --with-pgconfig=/usr/local/PostgreSQL/9.5/bin/pg_config --with-projdir=/usr/local/proj --with-gdalconfig=/usr/local/gdal/bin/gdal-config --with-geosconfig=/usr/local/geos/bin/geos-config --with-jsondir=/usr/local/json --with-xml2config=/usr/bin/xml2-config --with-gui --with-topology

make

make install

3、安装完成PostGIS后,创建空间数据库

(1)、切换到postgres 用户下 su - postgres

(2)、创建一个空间模板数据库 createdb template_postgis

(3)、对postgis 库赋予空间扩展

psql -f /usr/local/PostgreSQL/9.5/share/postgresql/contrib/postgis-2.3/postgis.sql -d template_postgis

psql -f /usr/local/PostgreSQL/9.5/share/postgresql/contrib/postgis-2.3/spatial_ref_sys.sql -d template_postgis


注意,大坑:执行上面两句,会报错;ERROR: current transaction is aborted, commands ignored until end of transaction block

把postgis.sql 文件拷贝到客户机上,使用pgAdmin 执行,看哪句报错,我执行了一下 莫名其妙:[Err] ERROR: could not load library "/usr/local/PostgreSQL/9.5/lib/postgresql/postgis-2.3.so": libgeos_c.so.1: 无法打开共享对象文件: 没有那个文件或目录

这个好像是postgis-2.3.so依赖少了,于是 执行 ldd postgis-2.3.so 看看少了哪些依赖

切换到root 账户,执行以下命令 vi /etc/ld.so.conf,追加以下几行:

/usr/local/gdal/lib/
/usr/local/proj/lib/
/usr/local/geos/lib/
/usr/local/json/lib/

,然后执行 ldconfig

再执行 ldd postgis-2.3.so 看看 这次依赖解决了(有人说,在geos、json、gdal、proj 安装目录把少的so 文件手动拷贝到 postgresql 目录中,这个方法不行)

这样,再切换到postgres 用户,执行

psql -f /usr/local/PostgreSQL/9.5/share/postgresql/contrib/postgis-2.3/postgis.sql -d template_postgis

psql -f /usr/local/PostgreSQL/9.5/share/postgresql/contrib/postgis-2.3/spatial_ref_sys.sql -d template_postgis

这下没啥问题了。


全文完,散花.....

相关文章