CentOS7 阿里云 PG 镜像 PG10.9 → PG17 完整升级指南

目录

一、前置说明

[二、替换阿里云 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 升级(大库推荐)

一、前置说明

  1. CentOS7 官方最高支持 PG17,阿里云镜像同步 PGDG 官方包;
  2. PG10 与 PG17 跨 7 个大版本,必须新旧共存安装,不能直接覆盖;
  3. 核心变更提前自查:WITH OIDS、pg_xlog→pg_wal、recovery.conf 废弃、聚合 / JSON 语法变更;
  4. 所有自定义扩展(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

  1. 切断应用写入,执行刷盘检查点
sql 复制代码
CHECKPOINT;
  1. 停止 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

常见报错处理

  1. 存在带 WITH OIDS 表:启动 PG10 执行 ALTER TABLE xxx SET WITHOUT OIDS;
  2. 扩展缺失:yum 安装阿里云源中 pg17 对应 contrib 包
  3. collate/ctype 不匹配:删除 pg17/data 目录,重新 initdb 统一参数

要求新旧 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

迁移规则:

  1. 保留原有业务参数:shared_buffers、max_connections、wal_buffers 等;
  2. 删除废弃参数:checkpoint_segments、recovery.* 系列配置;
  3. 端口统一 5432:port = 5432

十一、启动 PG17 并生成统计信息

bash 复制代码
systemctl start postgresql-17
# 生成全库统计
su - postgres
sh analyze_new_cluster.sh

十二、业务验证与清理旧版本

  1. 验证:数据库、表、数据、触发器、存储过程、扩展、读写业务全流程;
  2. 稳定运行 7 天无异常后清理:
bash 复制代码
# 删除pg10数据目录
sh delete_old_cluster.sh
# 卸载pg10所有安装包
yum remove -y postgresql10*

方案二:逻辑导出导入(中小库,零风险)

适合数据量小、担心跨版本兼容异常场景:

  1. 执行上方 pg_dumpall 全量备份;
  2. 停止并卸载 PG10;
  3. 安装 PG17 并 initdb 初始化;
  4. 启动 PG17,安装全部业务扩展;
  5. 导入备份:
bash 复制代码
su - postgres
psql -f /data/pg10_full_back.sql postgres
  1. 全局分析:ANALYZE VERBOSE;

十三、主从集群升级要点

  1. 所有备库先停机,仅主库执行 pg_upgrade;
  2. 主库升级验证正常后,使用 pg_basebackup 重新搭建 PG17 备库;
  3. 逻辑复制表必须设置主键或 REPLICA IDENTITY FULL。

十四、升级后必做检查优化

  1. 监控脚本替换:pg_xlogpg_wal
  2. 重建膨胀索引:REINDEX DATABASE 库名;
  3. 应用 SQL 回归测试:GROUP BY、聚合函数、JSONB 相关语句;
  4. 根据 PG17 新版默认值调整并行、WAL、内存参数。

十五、回滚方案(升级失败应急)

  1. 预校验失败:删除 /var/lib/pgsql/17/data,重新 initdb,启动 PG10 恢复业务;
  2. 业务运行异常:停止 pg17,卸载 pg17,重装 pg10,恢复 /data/pg10_data_bak 数据目录启动;
  3. 终极兜底:使用 pg_dumpall 备份在 PG10 重建数据库。

阿里云镜像加速说明

文中 repo 全部使用mirrors.aliyun.com,下载速度远快于国外官方源,CentOS7 安装 PG17 不会出现包下载超时问题。

相关推荐
张3蜂8 小时前
ALB、NLB、GWLB、CLB怎么选?
阿里云·云计算
倒流时光三十年11 小时前
PostgreSQL Semi-Join(半连接)通俗讲解
数据库·postgresql
IvorySQL15 小时前
PostgreSQL 日报| RI 快速路径并发读取缺陷(8 月 13 日)
数据库·postgresql
Kendra9191 天前
从 0 到上线:单文件网页 App 部署到阿里云 ECS 全流程(Nginx+Node+PM2+PostgreSQL)
nginx·阿里云·云计算·部署·个人开发·今天吃什么
一只fish1 天前
优化器架构对比:Oracle vs PostgreSQL vs MySQL
mysql·postgresql·oracle
ClouGence1 天前
PostgreSQL 同步到 Iceberg:开源、私有部署与 SaaS 方案对比
数据库·postgresql·开源
北极糊的狐1 天前
阿里云宝塔输入cat /www/server/panel/config/safe_path.conf报错 No such file or directory
阿里云·云计算
l1t1 天前
DeepSeek总结的在 pg_stat_statements 中诊断高基数工作负载
数据库·缓存·postgresql
北极糊的狐2 天前
阿里云宝塔报错bash tools/update.sh: No such file or directory 意思是:tools 整个目录直接丢失
阿里云·云计算·bash
NiceCloud喜云2 天前
阿里云 ECS 实例怎么选:面向出海业务的规格、地域与成本判断
阿里云·云计算