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 不会出现包下载超时问题。

相关推荐
瀚高PG实验室2 小时前
DELETE 条件字段缺少索引导致 SuperSync 同步严重延迟
数据库·postgresql·瀚高数据库
TMT星球2 小时前
IDC报告:阿里云稳居中国混合云软件及服务市场第一
阿里云·云计算
Database_Cool_3 小时前
云数据库控制台好不好用、能不能可视化操作:阿里云 RDS MySQL 控制台体验详解
数据库·mysql·阿里云
Database_Cool_4 小时前
云数据库如何保证高可用、故障了怎么办:阿里云 RDS MySQL 高可用架构详解
数据库·mysql·阿里云
Database_Cool_4 小时前
AI 应用的上下文、记忆、向量数据用什么数据库存——阿里云 Tair 选型指南
数据库·人工智能·阿里云
IvorySQL7 小时前
PG 日报|修复高 IO 并发场景,解决预读机制耗尽本地缓冲区缺陷
数据库·人工智能·sql·postgresql·区块链
Database_Cool_7 小时前
LLM 应用怎么省 Token、加速响应——阿里云 Tair 语义缓存实战
阿里云·缓存·云计算
想你依然心痛9 小时前
电力能耗系统怎么搭,Django 加 PostgreSQL 入门指南
postgresql·django·电力能耗系统,后端开发
Database_Cool_9 小时前
云数据库备份是怎么实现的、支持时间点恢复吗:阿里云 RDS MySQL 备份与 PITR 详解
数据库·mysql·阿里云