欢迎光临
我们一直在努力

openEuler 24.03 部署 PostgreSQL 17:源码编译 + pgvector + SQL 转换

一、本篇目标

上一篇完成了 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 用户授权 ✅

关键坑提醒:

  • PG 17 不需要 –enable-thread-safety,已废弃
  • 缺 python3-devel 会导致 configure 失败
  • initdb 必须用 pgsql 用户,不能用 root
  • 日志目录属主必须是 pgsql,否则启动失败
  • PostgreSQL 15+ 必须授权 public schema,否则应用报 relation does not exist
  • 下一篇开始编译 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 完整方案
    赞(0)
    未经允许不得转载:171主机测评 » openEuler 24.03 部署 PostgreSQL 17:源码编译 + pgvector + SQL 转换
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址