本文针对Ubuntu24.04系统,提供PostgreSQL15.6、PostGIS3.4.2、pgRouting3.6.0及LZ4压缩支持的完整源码安装方案,解决源码编译路径关联、systemctl服务配置、Navicat远程连接等核心问题,包含全程避坑指南,适用于GIS开发及数据库运维场景。

一、前置说明与环境准备

1.1 安装目标

  • 安装路径:自定义目录/data/postgresql-15.6/(便于管理和迁移)

  • 核心组件:PostgreSQL15.6(带LZ4压缩)、PostGIS3.4.2(空间扩展)、pgRouting3.6.0(路由扩展)

  • 功能支持:systemctl服务管理、Navicat远程连接、扩展功能完整可用

1.2 环境清理(避免残留干扰)

若系统曾安装过PostgreSQL相关组件,先执行清理命令,确保环境纯净:

# 卸载系统残留包
sudo apt autoremove --purge -y postgresql* postgis*
# 删除旧安装目录和临时文件
sudo rm -rf /data/postgresql-15.6 /tmp/postgresql-15.6 /tmp/postgis-3.4.2 /tmp/pgrouting-3.6.0

1.3 依赖包全量安装

源码编译需依赖大量开发库,一次性安装避免后续编译报错:

sudo apt update && sudo apt upgrade -y
sudo apt install -y build-essential libreadline-dev zlib1g-dev flex bison libxml2-dev libssl-dev \
libgdal-dev libgeos-dev libproj-dev libprotobuf-c-dev protobuf-c-compiler libjson-c-dev sqlite3 libsqlite3-dev \
cmake pkg-config liblz4-dev git libboost-all-dev libbz2-dev libzstd-dev libcurl4-openssl-dev \
python3-dev python3-pip debianutils openssl

关键依赖说明:debianutils提供config.sub工具(解决编译配置报错),libboost-all-dev为pgRouting必需依赖

二、核心组件安装步骤

2.1 自定义目录创建与授权

创建指定安装目录并配置权限,确保postgres用户可操作:

# 创建安装目录
sudo mkdir -p /data/postgresql-15.6
# 创建postgres用户组和用户(带家目录和shell)
sudo groupadd postgres
sudo useradd -m -g postgres -s /bin/bash postgres
# 设置postgres用户密码(记牢,Navicat连接用)
sudo passwd postgres
# 授权目录归属postgres用户
sudo chown -R postgres:postgres /data/postgresql-15.6/
sudo chmod -R 755 /data/postgresql-15.6/

2.2 源码下载与解压

进入/tmp临时目录下载源码,避免污染源码编译环境:

cd /tmp
# 1. 下载PostgreSQL15.6
wget https://ftp.postgresql.org/pub/source/v15.6/postgresql-15.6.tar.gz
tar -xzf postgresql-15.6.tar.gz

# 2. 下载PostGIS3.4.2
wget https://download.osgeo.org/postgis/source/postgis-3.4.2.tar.gz
tar -xzf postgis-3.4.2.tar.gz

# 3. 下载pgRouting3.6.0
wget https://github.com/pgRouting/pgrouting/archive/refs/tags/v3.6.0.tar.gz -O pgrouting-3.6.0.tar.gz
tar -xzf pgrouting-3.6.0.tar.gz

2.3 编译安装PostgreSQL15.6(带LZ4支持)

核心配置指定自定义目录和LZ4压缩,编译时利用多CPU核心加速:

cd /tmp/postgresql-15.6
# 配置编译参数(反斜杠后无空格,避免语法错误)
./configure \
--prefix=/data/postgresql-15.6 \
--with-openssl \
--with-libxml \
--with-readline \
--with-python \
--with-lz4 \
PYTHON=/usr/bin/python3

# 编译(-j$(nproc)自动识别CPU核心数)
make -j$(nproc) world
# 安装
sudo make install-world

# 初始化数据库(postgres用户执行,指定UTF8编码)
su - postgres -c "/data/postgresql-15.6/bin/initdb -U postgres -E UTF8 -D /data/postgresql-15.6/data"

避坑点:configure命令中反斜杠后不可加空格或注释,否则会出现“config.sub缺失参数”错误

2.4 编译安装PostGIS3.4.2(关联自定义PG)

通过环境变量强制关联自定义PostgreSQL目录,避免安装到系统默认路径:

cd /tmp/postgis-3.4.2
# 设置环境变量,优先使用自定义PG的pg_config
export PATH=/data/postgresql-15.6/bin:$PATH
export PG_CONFIG=/data/postgresql-15.6/bin/pg_config

# 配置编译参数(指定PG头文件和库文件路径)
./configure \
--prefix=/data/postgresql-15.6 \
--with-pgconfig=/data/postgresql-15.6/bin/pg_config \
--with-projdir=/usr \
--with-geosconfig=/usr/bin/geos-config \
--with-gdalconfig=/usr/bin/gdal-config \
CPPFLAGS="-I/data/postgresql-15.6/include" \
LDFLAGS="-L/data/postgresql-15.6/lib"

# 编译安装
make -j$(nproc)
sudo make install

# 验证安装(出现postgis相关文件即为成功)
ls /data/postgresql-15.6/share/extension | grep postgis

2.5 编译安装pgRouting3.6.0(适配PG15)

采用cmake构建,需在独立build目录执行,确保路径关联正确:

cd /tmp/pgrouting-3.6.0
# 创建build目录(规范编译流程)
mkdir build && cd build

# 配置cmake参数
cmake .. \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/data/postgresql-15.6 \
-DPOSTGRESQL_PG_CONFIG=/data/postgresql-15.6/bin/pg_config

# 编译安装
make -j$(nproc)
sudo make install

# 验证安装
ls /data/postgresql-15.6/share/extension | grep pgrouting

避坑点:不可在/data目录下执行cmake,需在/tmp/pgrouting-3.6.0/build目录操作,否则会出现“CMakeLists.txt缺失”错误

三、关键配置(systemctl+远程连接)

3.1 创建systemctl服务(支持服务管理)

手动创建服务文件,实现PostgreSQL的systemctl启动、停止和开机自启:

sudo tee /etc/systemd/system/postgresql-15.service > /dev/null << EOF
[Unit]
Description=PostgreSQL 15 Database Server (Custom Source Install)
Documentation=https://www.postgresql.org/docs/15/
After=network.target  # 网络服务启动后再启动PG

[Service]
Type=forking  # 后台运行模式
User=postgres  # 以postgres用户运行
Group=postgres  # 关联postgres用户组
# 启动命令(指定数据目录,-w等待启动完成)
ExecStart=/data/postgresql-15.6/bin/pg_ctl start -D /data/postgresql-15.6/data -s -w -t 60
# 停止命令(快速停止,避免数据丢失)
ExecStop=/data/postgresql-15.6/bin/pg_ctl stop -D /data/postgresql-15.6/data -s -m fast
# 重新加载配置
ExecReload=/data/postgresql-15.6/bin/pg_ctl reload -D /data/postgresql-15.6/data -s
LimitNOFILE=65535  # 提升文件描述符限制
Restart=on-failure  # 故障时自动重启

[Install]
WantedBy=multi-user.target  # 多用户模式下启动
EOF

服务文件创建后,执行以下命令启用并启动服务:

# 重新加载systemd配置(识别新服务)
sudo systemctl daemon-reload
# 启动PostgreSQL服务
sudo systemctl start postgresql-15
# 设置开机自启
sudo systemctl enable postgresql-15
# 验证服务状态(显示active (running)即为成功)
sudo systemctl status postgresql-15

若启动失败,查看日志排查问题:su - postgres -c “tail -f /data/postgresql-15.6/data/log/postgresql-*.log”

3.2 配置Navicat远程连接

需修改PG配置文件允许远程访问,并开放防火墙端口,确保Navicat能正常连接。

3.2.1 修改PG核心配置
# 1. 修改postgresql.conf(允许所有IP监听)
su - postgres -c "sed -i 's/^listen_addresses = .*/listen_addresses = '*'/g' /data/postgresql-15.6/data/postgresql.conf"

# 2. 修改pg_hba.conf(允许密码认证)
su - postgres -c "echo 'host    all             all             0.0.0.0/0               md5' >> /data/postgresql-15.6/data/pg_hba.conf"
su - postgres -c "echo 'host    all             all             ::/0                    md5' >> /data/postgresql-15.6/data/pg_hba.conf"

# 3. 重启服务使配置生效
sudo systemctl restart postgresql-15
3.2.2 开放防火墙端口

Ubuntu默认防火墙ufw开放5432端口(PG默认端口):

# 开放5432端口
sudo ufw allow 5432/tcp
# 重启防火墙
sudo ufw reload
# 验证端口开放状态
sudo ufw status
3.2.3 Navicat连接配置

打开Navicat客户端,新建“PostgreSQL连接”,输入以下信息:

  • 连接名:自定义(如PG15-GIS)

  • 主机:Ubuntu服务器IP地址(本地测试用127.0.0.1)

  • 端口:5432(默认端口,若修改需对应调整)

  • 用户名:postgres(初始化的超级用户)

  • 密码:步骤2.1中设置的postgres用户密码

  • 数据库:postgres(默认数据库)

点击“测试连接”,显示“连接成功”即完成配置。

四、全量功能验证

安装完成后,需验证PostgreSQL、LZ4压缩、PostGIS、pgRouting的功能是否正常。

4.1 验证LZ4压缩功能

# 切换到postgres用户,登录数据库
su - postgres
/data/postgresql-15.6/bin/psql -U postgres

# 执行SQL验证LZ4
DROP TABLE IF EXISTS test_lz4;
CREATE TABLE test_lz4 (txt text COMPRESSION lz4);
INSERT INTO test_lz4 SELECT repeat('postgresql-gis', 1000);
SELECT pg_column_compression(txt) FROM test_lz4;  -- 输出lz4即为成功

4.2 验证PostGIS与pgRouting扩展

在数据库终端继续执行以下命令:

# 创建扩展(若已创建可跳过)
CREATE EXTENSION IF NOT EXISTS postgis;
CREATE EXTENSION IF NOT EXISTS pgrouting;
CREATE EXTENSION IF NOT EXISTS postgis_topology;

# 查看已安装扩展(应显示所有组件及版本)
\dx;

# PostGIS功能测试(创建空间表)
DROP TABLE IF EXISTS test_geo;
CREATE TABLE test_geo (id int, geom geometry(Point,4326));
INSERT INTO test_geo VALUES (1, ST_GeomFromText('POINT(116.403874 39.914885)', 4326));
SELECT id, ST_AsText(geom) FROM test_geo;  -- 输出空间坐标即为成功

五、运维常用命令汇总

整理日常管理常用命令,方便快速操作:

操作目的命令
启动服务sudo systemctl start postgresql-15
停止服务sudo systemctl stop postgresql-15
重启服务sudo systemctl restart postgresql-15
查看服务状态sudo systemctl status postgresql-15
登录数据库su - postgres -c “/data/postgresql-15.6/bin/psql -U postgres”
查看日志su - postgres -c “tail -f /data/postgresql-15.6/data/log/postgresql-*.log”
备份数据库su - postgres -c “/data/postgresql-15.6/bin/pg_dump -U postgres 数据库名 > 备份文件.sql”
恢复数据库su - postgres -c “/data/postgresql-15.6/bin/psql -U postgres 数据库名 < 备份文件.sql”

六、常见问题与解决方案

6.1 编译报错“config.sub缺失参数”

原因:configure命令中反斜杠后加了空格或注释;缺少debianutils依赖。
解决:1. 确保反斜杠后无任何字符;2. 安装依赖:sudo apt install -y debianutils。

6.2 PostGIS扩展未安装到自定义目录

原因:未配置环境变量,导致PostGIS关联系统默认PG。
解决:编译前执行export PATH=/data/postgresql-15.6/bin:$PATH,或手动复制扩展文件:
sudo cp /usr/local/share/postgresql/extension/postgis* /data/postgresql-15.6/share/extension/

6.3 Navicat连接超时

原因:1. PG未允许远程访问;2. 防火墙未开放端口;3. 服务未启动。
解决:1. 检查postgresql.conf和pg_hba.conf配置;2. 开放5432端口;3. 确保服务正常运行。

6.4 启动服务提示“权限不足”

原因:/data/postgresql-15.6目录归属非postgres用户。
解决:执行sudo chown -R postgres:postgres /data/postgresql-15.6/。

七、总结

本文通过“环境准备-组件安装-配置验证”的流程,实现了Ubuntu24.04系统下PostgreSQL15.6+PostGIS3.4.2+pgRouting3.6.0的完整安装。核心关键点在于:

  1. 严格控制编译参数,确保组件关联自定义PG目录;
  2. 正确配置postgres用户权限,避免服务启动问题;
  3. 完善systemctl服务和远程连接配置,满足生产使用需求。
    按照步骤执行可规避90%以上的源码安装问题,若遇到特殊报错,可通过日志排查或参考“常见问题”章节解决。

(注:文档部分内容可能由 AI 生成)

更多推荐