一、本篇目标
上一篇完成了 Nginx 源码编译。本篇处理 JeecgBoot 的核心依赖:PostgreSQL 17。
JeecgBoot 3.9.5 官方默认使用 MySQL,但我们选择 PostgreSQL,原因:
- 信创环境推荐使用国产化或开源数据库
- PostgreSQL 功能强大,兼容性好
- 配合 pgvector 可支持 AI 知识库功能
- 避免 MySQL 授权问题
本篇完成:
- PostgreSQL 17.10 源码编译
- pgvector 0.8.6 向量扩展集成
- 数据库初始化与权限配置
- JeecgBoot SQL 脚本转换(引用独立文章)
二、为什么源码编译
PostgreSQL 有三种安装方式:
| 系统包(dnf) | 安装快,依赖自动解决 | 版本受源限制,位置固定 |
| 二进制 tar 包 | 版本灵活 | 需手动管理依赖 |
| 源码编译 | 完全可控,自包含 | 编译耗时 |
选择源码编译的理由:
- 二进制和配置自包含在 /usr/local/pgsql
- 重装系统后从 /data/packages 解压即恢复
- 编译参数可精确控制(ICU、SSL、systemd 等)
三、安装编译依赖
dnf install -y \\
readline-devel libicu-devel zlib-devel openssl-devel \\
bison flex perl perl-ExtUtils-Embed \\
libxml2-devel libxslt-devel openldap-devel \\
pam-devel systemd-devel gettext-devel
关键依赖说明:
| readline-devel | psql 命令行编辑 |
| libicu-devel | 国际化排序(–with-icu) |
| openssl-devel | SSL/TLS 加密 |
| bison/flex | SQL 解析器生成 |
| systemd-devel | systemd 通知集成 |
| pam-devel | PAM 认证 |
| libxml2-devel | XML 类型支持 |
四、下载源码
mkdir -p /data/packages/postgresql17
cd /data/packages/postgresql17
# 下载源码和校验文件
wget https://ftp.postgresql.org/pub/source/v17.10/postgresql-17.10.tar.bz2
wget https://ftp.postgresql.org/pub/source/v17.10/postgresql-17.10.tar.bz2.sha256
# 验证完整性
sha256sum -c postgresql-17.10.tar.bz2.sha256
期望:postgresql-17.10.tar.bz2: 成功
解压到源码目录:
cd /usr/local/src
tar -xjf /data/packages/postgresql17/postgresql-17.10.tar.bz2
五、configure 配置
cd /usr/local/src/postgresql-17.10
./configure \\
–prefix=/usr/local/pgsql \\
–with-openssl \\
–with-zlib \\
–with-icu \\
–with-libxml \\
–with-libxslt \\
–with-ldap \\
–with-pam \\
–with-systemd \\
–with-perl \\
–with-python \\
–enable-nls 2>&1 | tee /tmp/pg-configure.log
关键参数说明:
| –prefix=/usr/local/pgsql | 安装路径 |
| –with-openssl | SSL/TLS 加密连接 |
| –with-icu | 国际化排序 |
| –with-systemd | systemd 通知 |
| –with-python | PL/Python 存储过程 |
| –enable-nls | 多语言支持 |
注意:PG 17 已默认线程安全,不需要 –enable-thread-safety(这个参数已废弃)。
常见坑:如果缺少 Python 头文件,会报 header file <Python.h> is required,需要额外安装:
dnf install -y python3-devel
六、编译安装
cd /usr/local/src/postgresql-17.10
# 编译(用满 CPU 核)
make -j$(nproc) 2>&1 | tee /tmp/pg-build.log
# 安装
make install 2>&1 | tee /tmp/pg-install.log
# 验证
/usr/local/pgsql/bin/postgres –version
期望:postgres (PostgreSQL) 17.10
6.1 编译 contrib 扩展
PG 源码的 contrib/ 包含大量常用扩展(pg_stat_statements、uuid-ossp、hstore 等),必须编译:
cd /usr/local/src/postgresql-17.10/contrib
make -j$(nproc) 2>&1 | tee /tmp/pg-contrib-build.log
make install 2>&1 | tee /tmp/pg-contrib-install.log
七、初始化数据库
注意:PostgreSQL 拒绝以 root 运行 initdb,必须切换到 pgsql 用户。
7.1 设置属主
chown -R pgsql:pgsql /usr/local/pgsql /data/pgdata
7.2 执行 initdb
su -s /bin/bash pgsql -c "
/usr/local/pgsql/bin/initdb \\
-D /data/pgdata \\
-E UTF8 \\
–locale=C \\
–auth-local=trust \\
–auth-host=scram-sha-256
"
参数说明:
| -D /data/pgdata | 数据目录 |
| -E UTF8 | 默认编码 |
| –locale=C | 排序规则(C 兼容性最好) |
| –auth-local=trust | 本地 socket 免密 |
| –auth-host=scram-sha-256 | TCP 连接用密码 |
7.3 日志目录
常见坑:pg_ctl 启动时写日志到 /data/logs,但该目录属主是 root,会报 Permission denied。
mkdir -p /data/logs/pgsql
chown -R pgsql:pgsql /data/logs/pgsql
八、systemd 服务
cat > /etc/systemd/system/postgresql-17.service <<'EOF'
[Unit]
Description=PostgreSQL 17 database server
After=network.target
[Service]
Type=forking
User=pgsql
Group=pgsql
Environment=PGDATA=/data/pgdata
Environment=PGLOG=/data/logs/pgsql/pg.log
ExecStart=/usr/local/pgsql/bin/pg_ctl -D ${PGDATA} -l ${PGLOG} start
ExecStop=/usr/local/pgsql/bin/pg_ctl -D ${PGDATA} stop -m fast
ExecReload=/usr/local/pgsql/bin/pg_ctl -D ${PGDATA} reload
TimeoutSec=300
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable –now postgresql-17
systemctl status postgresql-17
验证:
ss -lntp | grep 5432
/usr/local/pgsql/bin/psql -h /tmp -U pgsql -d postgres -c "SELECT version();"
九、pgvector 向量扩展
pgvector 为 PG 提供向量存储和相似度检索能力,JeecgBoot 的 AI 知识库功能依赖它。
9.1 下载源码
注意:华为云的 pgvector 目录是 SPA 页面,不是真实文件,只能用 GitHub。
mkdir -p /data/packages/pgvector
cd /data/packages/pgvector
wget –content-disposition –trust-server-names \\
"https://github.com/pgvector/pgvector/archive/refs/tags/v0.8.6.tar.gz"
cd /usr/local/src
tar -xzf /data/packages/pgvector/pgvector-0.8.6.tar.gz
9.2 编译安装
cd /usr/local/src/pgvector-0.8.6
export PG_CONFIG=/usr/local/pgsql/bin/pg_config
make -j$(nproc) PG_CONFIG=$PG_CONFIG
make install PG_CONFIG=$PG_CONFIG
9.3 设置属主
chown -R pgsql:pgsql /usr/local/pgsql/lib/vector.so
chown -R pgsql:pgsql /usr/local/pgsql/share/extension/vector*
chown -R pgsql:pgsql /usr/local/pgsql/include/server/extension/vector/
9.4 启用扩展
su -s /bin/bash pgsql -c "/usr/local/pgsql/bin/psql -h /tmp -U pgsql -d postgres -c 'CREATE EXTENSION IF NOT EXISTS vector;'"
su -s /bin/bash pgsql -c "/usr/local/pgsql/bin/psql -h /tmp -U pgsql -d postgres -c '\\dx'"
期望:看到 vector | 0.8.6。
十、SQL 脚本转换与数据库初始化
JeecgBoot 官方只提供 MySQL 脚本,PostgreSQL 需要自行转换。
转换方案详见独立文章:
📖 JeecgBoot 3.9.5 MySQL 脚本一键转 PostgreSQL 完整方案
该文章提供了完整的 Python 转换脚本和 Gitee 开源仓库,导入错误数 0,143 张表全部生成。
10.1 快速导入
# 1. 创建数据库和用户
su -s /bin/bash pgsql -c "/usr/local/pgsql/bin/psql -h /tmp -U pgsql -d postgres -c \\"CREATE USER jeecg WITH PASSWORD 'yourpwd';\\""
su -s /bin/bash pgsql -c "/usr/local/pgsql/bin/psql -h /tmp -U pgsql -d postgres -c \\"CREATE DATABASE jeecg_boot OWNER jeecg ENCODING 'UTF8' LC_COLLATE 'C' LC_CTYPE 'C' TEMPLATE template0;\\""
# 2. 导入 PG 脚本
su -s /bin/bash pgsql -c "/usr/local/pgsql/bin/psql -h /tmp -U pgsql -d jeecg_boot -f /path/to/jeecgboot-postgresql.sql"
# 3. 启用 pgvector
su -s /bin/bash pgsql -c "/usr/local/pgsql/bin/psql -h /tmp -U pgsql -d jeecg_boot -c 'CREATE EXTENSION IF NOT EXISTS vector;'"
10.2 PostgreSQL 15+ 授权(关键)
PostgreSQL 15+ 默认不再对普通用户开放 public schema 的访问权限。导入后必须授权:
su -s /bin/bash pgsql -c "/usr/local/pgsql/bin/psql -h /tmp -U pgsql -d jeecg_boot" << 'SQL_EOF'
GRANT USAGE ON SCHEMA public TO jeecg;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO jeecg;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO jeecg;
GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public TO jeecg;
GRANT CREATE ON SCHEMA public TO jeecg;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO jeecg;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO jeecg;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON FUNCTIONS TO jeecg;
SQL_EOF
如果跳过这步,应用启动时会报 relation "xxx" does not exist。
10.3 验证
echo "===== 表数量 ====="
su -s /bin/bash pgsql -c "/usr/local/pgsql/bin/psql -h /tmp -U pgsql -d jeecg_boot -c \\"SELECT count(*) FROM pg_tables WHERE schemaname='public';\\""
echo
echo "===== jeecg 用户连接测试 ====="
PGPASSWORD=yourpwd /usr/local/pgsql/bin/psql -h 127.0.0.1 -p 5432 -U jeecg -d jeecg_boot -c "SELECT count(*) FROM sys_user;"
期望:表数量 143,sys_user 有数据。
十一、总结
本篇完成:
| PostgreSQL 17.10 源码编译 | ✅ |
| contrib 扩展编译 | ✅ |
| pgvector 0.8.6 集成 | ✅ |
| initdb 初始化 | ✅ |
| systemd 服务 | ✅ |
| SQL 脚本转换 | ✅(引用独立文章) |
| jeecg 用户授权 | ✅ |
关键坑提醒:
下一篇开始编译 JeecgBoot 后端。
项目地址:https://gitee.com/dboru/jeecgboot-pg-converter
本系列文章:
- 第 1 篇:为什么从 3.8.3 升级到 3.9.5
- 第 2 篇:环境准备与数据盘规划
- 第 3 篇:Redis 7.4 源码编译与内核参数调优
- 第 4 篇:Nginx 1.28 源码编译与反向代理配置
- 第 5 篇:PostgreSQL 17 源码编译 + pgvector + SQL 转换(本文)
- 第 6 篇:JeecgBoot 后端编译与 systemd 部署
- 第 7 篇:JeecgBoot 前端编译与 Nginx 部署
- 第 8 篇:部署归档与一键恢复方案
配套文章:
- JeecgBoot 3.9.5 MySQL 脚本一键转 PostgreSQL 完整方案





