前言

在联网的Linux环境上安装PostgreSQLPostGIS,可能就是几句命令的事儿,相关的依赖可以自动安装,但是在离线的环境下安装,需要先编译安装各个依赖。

本文以麒麟服务器4.0.2为测试环境,离线编译安装PostgreSQL 12.2PostGIS 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

此处的坑

此处麒麟系统有两个坑,分别如下:

  1. 麒麟server版本的镜像里面缺少zlib1g-dev这个包,但是麒麟desktop里面包含这个包,所以需要把桌面版的镜像挂载上,当作apt的源,从中安装依赖。然后再挂载server版的镜像,安装其他包。
  2. 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用户的密码,回车

所需源码包、工具

  1. libsystemd-dev_229-4ubuntu4_amd64.deb
  2. cmake-3.20.1.tar.gz
  3. postgresql-12.2.tar.gz
  4. sqlite-autoconf-3380200.tar.gz
  5. geos-3.8.1.tar.gz
  6. proj-6.2.1.tar.gz
  7. gdal-3.1.1.tar.gz
  8. json-c-json-c-0.14-20200419.tar.gz
  9. postgis-3.0.5.tar.gz
  10. pgadmin4-6.8-x64.exe

相关安装包可自行Google搜索下载。也可从百度网盘下载:

链接:https://pan.baidu.com/s/1txTxd6xwHlx2-F_Ej8R4NQ 
提取码:pgsq

安装步骤

所有操作均用root用户进行,非root用户的操作我会特别注明su - postgres

安装PostgreSQL

安装并配置

  1. 安装libsystemd-dev_229-4ubuntu4_amd64.deb

    # 如果不需要systemd控制PostgreSQL的话,不用安装此包
    # 此包在服务版和桌面版的系统iso镜像里面都没有找到,所以只能从网上下载了一个对应版本的Ubuntu的包
    dpkg --force-depends -i libsystemd-dev_229-4ubuntu4_amd64.deb
  2. 编译安装

    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
  3. 编辑环境变量

    # 切换到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
  4. 初始化数据库实例

    # postgres用户执行
    
    # 创建data文件夹
    mkdir /home/postgres/pgdata
    
    # 初始化数据库实例
    initdb
    
    # 启动数据库
    pg_ctl -l logfile start
    
  5. 编辑数据库配置文件

    # 切换到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'
    
    # 保存退出
    
  6. 重启数据库

    pg_ctl restart
    

测试

以下测试方法,二选其一即可。终端测试简单,不用再安装其他工具。客户端测试需要安装GUI客户端pgAdmin

  1. 使用终端测试

    # 测试连接,会进入psql的交互界面
    psql
    
    # \l,查看所有的数据库
    \l
    
    # \q,退出psql交互
    \q
    

修改密码

  1. 使用psql终端登录

    psql
    
  2. 修改postgres的密码

    alter user postgres with password 'postgres';
    
  3. 以后使用客户端登录的话需要输入密码。

安装PostGIS及相关依赖

编译安装

  1. 编译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
    
  2. 编译geos

    tar -xzvf geos-3.8.1.tar.gz
    cd geos-3.8.1
    mkdir build
    cd build
    cmake ..
    make -j$(nproc)
    make install
    
  3. 编译sqlite3

    # proj依赖sqlite3
    tar -xzvf sqlite-autoconf-3380200.tar.gz 
    cd sqlite-autoconf-3380200
    ./configure 
    make -j$(nproc)
    make install
    
  4. 编译proj

    tar -xzvf proj-6.2.1.tar.gz
    cd proj-6.2.1
    ./configure
    make -j$(nproc)
    make install
    
  5. 编译gdal

    tar -xzvf gdal-3.1.1.tar.gz
    cd gdal-3.1.1
    ./configure
    make -j$(nproc)        # 此处编译较慢,请耐心等待,我在笔记本上尝试,耗时41分钟左右。
    make install
    
  6. 编译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
    
  7. 编译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
    
  8. 编译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
    
  9. 编辑动态库搜索路径

    vim /etc/ld.so.conf
    
    # 在最下面添加
    /usr/local/lib/
    
    # 保存退出后,在终端执行
    ldconfig
    

测试

  1. 使用终端测试

    su - postgres
    psql
    
    # 创建数据库
    create database gis;
    
    # 连接数据库
    \c gis
    
    # 创建插件
    create extension postgis;
    
    # 如果输出CREATE EXTENSION,证明postgis加载成功。
    
    #退出
    \q
    
  2. 使用客户端测试

    GUI客户端pgAdmin的操作步骤和其它数据库客户端操作步骤大同小异。不再赘述。

配合systemd开机启动

  1. 先暂停postgresql

    # 切换到postgres用户
    su - postgres
    
    # 停止
    pg_ctl -D /home/postgres/data/ -l /home/postgres/logfile stop
    
  2. 新增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
  3. 启动

    # 重新载入service配置文件
    systemctl daemon-reload
    
    # 启动pgsql
    systemctl start postgresql.service
    
    # 开机自启动
    systemctl enable postgresql.service

参考文档

  1. CentOS 7源码安装PostGIS(包含SFCGAL,PgRouting)
  2. CentOS 7 离线环境 PostgreSQL 12.2 编译安装 + PostGIS 3.0.1 编译安装 + 主从流复制配置
  3. [Starting the Database Server](

标签: PostgreSQL

添加新评论