目录
[二、替换阿里云 PostgreSQL 镜像源(CentOS7)](#二、替换阿里云 PostgreSQL 镜像源(CentOS7))
[1. 备份原有官方 pgdg 源](#1. 备份原有官方 pgdg 源)
[2. 写入阿里云 PG 镜像源](#2. 写入阿里云 PG 镜像源)
[3. 刷新 yum 缓存](#3. 刷新 yum 缓存)
[三、安装 PG17(与 PG10 共存)](#三、安装 PG17(与 PG10 共存))
[查看现有扩展,补齐 PG17 对应包](#查看现有扩展,补齐 PG17 对应包)
[五、查询 PG10 字符集与排序规则(关键)](#五、查询 PG10 字符集与排序规则(关键))
[六、初始化 PG17 空集群](#六、初始化 PG17 空集群)
[七、停业务、关闭 PG10](#七、停业务、关闭 PG10)
[八、pg_upgrade 预校验(只检测不迁移,报错全部修复)](#八、pg_upgrade 预校验(只检测不迁移,报错全部修复))
[九、正式升级(--link 硬链接,几乎不占额外磁盘)](#九、正式升级(--link 硬链接,几乎不占额外磁盘))
[1. 拷贝访问权限文件](#1. 拷贝访问权限文件)
[2. 合并 postgresql.conf(禁止直接覆盖)](#2. 合并 postgresql.conf(禁止直接覆盖))
[十一、启动 PG17 并生成统计信息](#十一、启动 PG17 并生成统计信息)
环境:CentOS 7 + 阿里云 PostgreSQL YUM 镜像,原地 pg_upgrade 升级(大库推荐)
一、前置说明
- CentOS7 官方最高支持 PG17,阿里云镜像同步 PGDG 官方包;
- PG10 与 PG17 跨 7 个大版本,必须新旧共存安装,不能直接覆盖;
- 核心变更提前自查:WITH OIDS、pg_xlog→pg_wal、recovery.conf 废弃、聚合 / JSON 语法变更;
- 所有自定义扩展(pg_stat_statements、pg_cron、postgis)必须安装 PG17 对应版本。
二、替换阿里云 PostgreSQL 镜像源(CentOS7)
1. 备份原有官方 pgdg 源
bash
mv /etc/yum.repos.d/pgdg-redhat-all.repo /etc/yum.repos.d/pgdg-redhat-all.repo.bak
2. 写入阿里云 PG 镜像源
cat > /etc/yum.repos.d/pgdg-aliyun.repo << EOF
[pgdg17]
name=PostgreSQL 17 for RHEL/CentOS \$releasever - \$basearch
baseurl=https://mirrors.aliyun.com/postgresql/yum/EL-7-\$basearch/pgdg17
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/postgresql/yum/RPM-GPG-KEY-PGDG
[pgdg10]
name=PostgreSQL 10 for RHEL/CentOS \$releasever - \$basearch
baseurl=https://mirrors.aliyun.com/postgresql/yum/EL-7-\$basearch/pgdg10
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/postgresql/yum/RPM-GPG-KEY-PGDG
EOF
3. 刷新 yum 缓存
bash
yum clean all && yum makecache
三、安装 PG17(与 PG10 共存)
bash
# 安装服务端、扩展、开发包
yum install -y postgresql17-server postgresql17-contrib postgresql17-devel postgresql17-libs
查看现有扩展,补齐 PG17 对应包
登录 PG10 查看已装扩展:
sql
\dx
SELECT extname FROM pg_extension;
示例安装(按需替换):
bash
yum install -y postgresql17-pg-stat-statements postgresql17-pg-cron
四、全量备份(必做,回滚兜底)
切换 postgres 用户操作:
bash
su - postgres
# 逻辑全库备份
pg_dumpall -f /data/pg10_full_back_$(date +%Y%m%d).sql
# 数据目录冷备份(可选,故障快速恢复)
cp -r /var/lib/pgsql/10/data /data/pg10_data_bak
五、查询 PG10 字符集与排序规则(关键)
sql
SELECT datname,datcollate,datctype FROM pg_database;
CentOS7 默认初始化一般为 C / C,后续 initdb 必须保持一致,否则 pg_upgrade 直接报错。
六、初始化 PG17 空集群
bash
# 初始化,字符集与排序和PG10保持一致
/usr/pgsql-17/bin/initdb -D /var/lib/pgsql/17/data -U postgres -E UTF8 --lc-collate=C --lc-ctype=C
# 关闭PG17自启,暂时不启动
systemctl stop postgresql-17
systemctl disable postgresql-17
七、停业务、关闭 PG10
- 切断应用写入,执行刷盘检查点
sql
CHECKPOINT;
- 停止 PG10 服务
sql
systemctl stop postgresql-10
# 查杀残留postgres进程
pkill -9 -f postgres
八、pg_upgrade 预校验(只检测不迁移,报错全部修复)
bash
su - postgres
/usr/pgsql-17/bin/pg_upgrade \
--old-bindir=/usr/pgsql-10/bin \
--new-bindir=/usr/pgsql-17/bin \
--old-datadir=/var/lib/pgsql/10/data \
--new-datadir=/var/lib/pgsql/17/data \
--jobs=$(nproc) \
--check
常见报错处理
- 存在带 WITH OIDS 表:启动 PG10 执行
ALTER TABLE xxx SET WITHOUT OIDS; - 扩展缺失:yum 安装阿里云源中 pg17 对应 contrib 包
- collate/ctype 不匹配:删除 pg17/data 目录,重新 initdb 统一参数
九、正式升级(--link 硬链接,几乎不占额外磁盘)
要求新旧 data 目录在同一分区;升级后 PG10 数据文件被硬链接,无法单独启动 PG10
bash
/usr/pgsql-17/bin/pg_upgrade \
--old-bindir=/usr/pgsql-10/bin \
--new-bindir=/usr/pgsql-17/bin \
--old-datadir=/var/lib/pgsql/10/data \
--new-datadir=/var/lib/pgsql/17/data \
--jobs=$(nproc) \
--link
输出 Upgrade Complete 代表升级成功,目录生成两个脚本:
analyze_new_cluster.sh:重建统计信息,不执行会导致查询性能极差delete_old_cluster.sh:业务稳定后清理 PG10 数据目录
十、迁移配置文件
1. 拷贝访问权限文件
bash
cp /var/lib/pgsql/10/data/{pg_hba.conf,pg_ident.conf} /var/lib/pgsql/17/data/
2. 合并 postgresql.conf(禁止直接覆盖)
bash
diff /var/lib/pgsql/10/data/postgresql.conf /var/lib/pgsql/17/data/postgresql.conf
迁移规则:
- 保留原有业务参数:shared_buffers、max_connections、wal_buffers 等;
- 删除废弃参数:checkpoint_segments、recovery.* 系列配置;
- 端口统一 5432:
port = 5432。
十一、启动 PG17 并生成统计信息
bash
systemctl start postgresql-17
# 生成全库统计
su - postgres
sh analyze_new_cluster.sh
十二、业务验证与清理旧版本
- 验证:数据库、表、数据、触发器、存储过程、扩展、读写业务全流程;
- 稳定运行 7 天无异常后清理:
bash
# 删除pg10数据目录
sh delete_old_cluster.sh
# 卸载pg10所有安装包
yum remove -y postgresql10*
方案二:逻辑导出导入(中小库,零风险)
适合数据量小、担心跨版本兼容异常场景:
- 执行上方 pg_dumpall 全量备份;
- 停止并卸载 PG10;
- 安装 PG17 并 initdb 初始化;
- 启动 PG17,安装全部业务扩展;
- 导入备份:
bash
su - postgres
psql -f /data/pg10_full_back.sql postgres
- 全局分析:
ANALYZE VERBOSE;
十三、主从集群升级要点
- 所有备库先停机,仅主库执行 pg_upgrade;
- 主库升级验证正常后,使用 pg_basebackup 重新搭建 PG17 备库;
- 逻辑复制表必须设置主键或 REPLICA IDENTITY FULL。
十四、升级后必做检查优化
- 监控脚本替换:
pg_xlog→pg_wal; - 重建膨胀索引:
REINDEX DATABASE 库名;; - 应用 SQL 回归测试:GROUP BY、聚合函数、JSONB 相关语句;
- 根据 PG17 新版默认值调整并行、WAL、内存参数。
十五、回滚方案(升级失败应急)
- 预校验失败:删除 /var/lib/pgsql/17/data,重新 initdb,启动 PG10 恢复业务;
- 业务运行异常:停止 pg17,卸载 pg17,重装 pg10,恢复 /data/pg10_data_bak 数据目录启动;
- 终极兜底:使用 pg_dumpall 备份在 PG10 重建数据库。
阿里云镜像加速说明
文中 repo 全部使用mirrors.aliyun.com,下载速度远快于国外官方源,CentOS7 安装 PG17 不会出现包下载超时问题。
