PostgreSQL 16.2 → 16.14 小版本升级操作手册
文档基础信息
项目 | 内容 |
当前运行版本 | PostgreSQL 16.2(源码编译) |
目标升级版本 | PostgreSQL 16.14 |
统一安装路径 | /usr/local/pgsql |
数据目录(不改动) | /data/pgdata/ |
编译标准参数 | --prefix=/usr/local/pgsql --with-ossp-uuid --with-openssl --with-system-tzdata=/usr/share/zoneinfo |
升级类型 | 小版本原地覆盖升级(数据目录无需 initdb,兼容同主版本所有小版本) |
适用系统 | CentOS/Rocky/ 银河麒麟 V10、Ubuntu/Debian |
前置要求 | 业务停机、tzdata 时区包升级、完整二进制 + 逻辑备份 |
一、升级前置确认与环境预处理
1.1 业务停机要求
升级操作必须在业务低峰窗口执行;
停止所有应用、定时任务、ETL同步、备份脚本、连接池;
确认无长事务、无在线 DDL、无 pg_dump 逻辑备份任务运行。
1.2 时区包强制升级(解决 Asia/Shanghai 时区 7 小时偏移 / 启动失败)
PG16 系列依赖系统时区文件,旧 tzdata 会导致时区异常、数据库启动报错,必须升级:
# RHEL/CentOS/麒麟 yum upgrade -y tzdata # Rocky8+/Fedora dnf upgrade -y tzdata
# 验证升级后版本 rpm -q tzdata # 修复系统时区软链接 ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
|
1.3 查看当前运行版本确认
# 查看二进制版本 /usr/local/pgsql/bin/psql --version # 数据库内确认版本 su - postgres psql -c "SELECT version();"
|
1.4 系统依赖完整性校验
# RHEL系 yum install -y gcc gcc-c++ make bison flex readline-devel zlib-devel openssl-devel libicu-devel libuuid-devel # Ubuntu系 apt install -y gcc g++ make bison flex libreadline-dev zlib1g-dev libssl-dev libicu-dev libuuid-dev
|
二、全量备份(升级前三道防线,缺一不可)
2.1 二进制程序目录备份(回滚核心)
覆盖安装会直接替换 /usr/local/pgsql 二进制,必须提前备份旧程序:
# 带时间戳备份 cp -r -a /usr/local/pgsql /usr/local/pgsql.bak_$(date +%Y%m%d_%H%M%S) # 校验备份文件存在 ls -ld /usr/local/pgsql.bak_*
|
2.2 数据库逻辑全量备份(数据兜底)
# 创建备份目录 mkdir -p /data/pg_backup # 全库导出所有库、用户、表结构、数据 sudo -u postgres pg_dumpall > /data/pg_backup/pg_all_backup_$(date +%Y%m%d_%H%M%S).sql # 校验备份文件生成、文件大小非0 ls -lh /data/pg_backup/pg_all_backup_*.sql
|
2.3 业务自有备份脚本执行
# 执行项目自定义定时备份脚本 ./runBackup.sh
|
三、下载 16.14 源码并解压
# 进入临时目录 cd /tmp # 下载16.14源码 wget https://ftp.postgresql.org/pub/source/v16.14/postgresql-16.14.tar.gz # 解压 tar -zxvf postgresql-16.14.tar.gz cd postgresql-16.14
|
四、编译新版本源码
4.1 清理旧编译缓存
4.2 标准 configure 编译(与旧版本编译参数完全一致)
关键:编译参数必须和原 16.2 完全相同,否则扩展、SSL、uuid 插件会失效 |
升级到最新版本重启postgresql时区会报错
指定系统时区路径:--with-system-tzdata=/usr/share/zoneinfo
./configure \ --prefix=/usr/local/pgsql \ --with-ossp-uuid \ --with-openssl \ --with-system-tzdata=/usr/share/zoneinfo
|
4.3 完整编译(包含 contrib 全部扩展)
# 多核并行编译,利用全部CPU核心 make -j$(nproc) world
|
编译耗时:5~15 分钟,服务器 CPU 核心越多速度越快;
成功标识:PostgreSQL, contrib, and documentation successfully made. Ready to install.
五、停止现有 PostgreSQL 服务
5.1 停止数据库(fast 模式,快速回滚未提交事务)
# systemd方式 systemctl stop postgresql # 原生pg_ctl方式备用 /usr/local/pgsql/bin/pg_ctl stop -D /data/pgdata/ -m fast
|
5.2 校验 postgres 进程完全退出
ps aux | grep postgres | grep -v grep
|
输出为空代表进程全部关闭,存在残留进程需手动 kill 终止。
六、原地覆盖安装新版本二进制
# 覆盖安装到原/usr/local/pgsql目录 make install-world
|
校验新二进制版本
/usr/local/pgsql/bin/pg_ctl --version # 预期输出:pg_ctl (PostgreSQL) 16.14 /usr/local/pgsql/bin/psql --version
|
七、启动新版本数据库(数据目录不变)
7.1 启动服务
# systemd管理 systemctl start postgresql # 原生启动备用 /usr/local/pgsql/bin/pg_ctl start -D /data/pgdata/
|
7.2 查看启动日志,排查 ERROR/FATAL 报错
# 日志存放于数据目录示例 tail -100 /data/pgdata/postgresql-*.log # 自定义日志目录替换路径 tail -100 /var/log/pg16/postgresql-*.log
|
日志无 FATAL、ERROR、时区报错即为启动正常。
八、升级后全面功能验证
切换 postgres 用户执行验证:
确认数据库内核版本
SELECT version(); -- 预期:PostgreSQL 16.14
|
校验扩展完整性(uuid-ossp、pgcrypto 等)
SELECT extname,extversion FROM pg_extension;
|
查看全库列表
基础 SQL 可用性校验
SELECT 1; SELECT current_timestamp; SELECT now();
|
时区校验(规避 7 小时时差问题)
sql SHOW timezone; SHOW log_timezone; |
UUID 函数校验(验证 --with-ossp-uuid 编译生效)
SELECT uuid_generate_v4();
|
九、systemd 服务确认
路径未发生变更,无需修改 service 文件,仅确认运行状态:
systemctl status postgresql # 正常状态:active (running) systemctl enable postgresql
|
十、升级收尾清理规范
清理临时源码包(可选)
rm -rf /tmp/postgresql-16.14 /tmp/postgresql-16.14.tar.gz
|
二进制备份文件保留策略
/usr/local/pgsql.bak_*备份至少保留 7 天,业务稳定无异常后再删除;
十一、升级失败完整回滚流程
1. 停止新版本数据库
systemctl stop postgresql /usr/local/pgsql/bin/pg_ctl stop -D /data/pgdata/ -m fast
|
2. 删除覆盖后的新版程序目录
3. 恢复升级前备份的旧二进制
# 修改为你实际备份的时间戳目录 mv /usr/local/pgsql.bak_20260717_103000 /usr/local/pgsql
|
4. 使用旧版本启动数据库
systemctl start postgresql # 或 /usr/local/pgsql/bin/pg_ctl start -D /data/pgdata/
|
5. 验证回滚版本
/usr/local/pgsql/bin/psql -c "SELECT version();" # 应恢复为 PostgreSQL 16.2
|
十二、升级注意事项 & 坑点规避
1.编译参数必须完全一致:新增 / 删减编译参数会导致原有扩展失效、SSL 连接报错;
2.小版本升级数据目录无需 initdb,同主版本 16.x 数据完全兼容,禁止重新初始化;
3.timezone = 'Asia/Shanghai' 新版启动会失败,需要编译时指定系统时区路径;
4.覆盖安装前必须停库,运行中直接 make install 会导致二进制文件损坏、数据库崩溃;
5.所有备份文件分开存储,逻辑备份不要放在数据盘,防止磁盘故障丢失;
6.国产麒麟系统最小化镜像需完整安装 tzdata,不要使用精简时区包;
7.若编译新增 pg_duckdb 等第三方插件,升级后需重新编译对应插件适配 16.14。