Linux 上 PostgreSQL 升级关键注意事项
一 升级前的准备与评估
- 明确版本类型:小版本(如 14.5 → 14.7)仅替换二进制、不改存储格式;大版本(如 14.x → 15.x)涉及系统表与内部格式变化,需要迁移工具或重建。先确认当前与目标版本,并预留维护窗口。
- 全量备份与文件系统快照:至少做一次可回滚的备份(如 pg_dumpall),必要时对 $PGDATA 做快照/复制,确保可快速恢复。
- 扩展与依赖盘点:列出已安装扩展(如 postgis、timescaledb),确认目标版本支持情况;部分扩展需在新版本中重新安装或升级。
- 版本生命周期与兼容性:核对目标版本是否仍在维护期,跨多个主版本升级时,需逐版本阅读发行说明的 Migration 部分,避免语法/行为不兼容。
- 回滚方案:准备回滚路径(备份恢复、旧实例保留、连接串回切),并在演练环境验证。
二 小版本升级要点
- 操作原则:同一主版本内升级通常只需安装新包并重启,无需迁移数据目录。
- 建议流程:
- 备份与停机(可选但推荐);2) 更新软件源并升级对应主版本的包(如 postgresql-14);3) 启动服务并验证版本与健康状态。
- 注意:不要跨主版本混用包;升级后检查日志与关键业务功能。
三 大版本升级路径与选择
-
常用路径对比:
| 方法 |
适用场景 |
停机时间 |
关键注意点 |
| pg_upgrade |
大中型库、本机就地升级 |
通常为几分钟 |
先做兼容性检查(–check);可用 –link 硬链加速(升级前务必备份);升级后重建统计信息 |
| 逻辑导出/导入(pg_dump/pg_restore) |
中小型库、跨平台/跨版本 |
与数据量成正比 |
建议用新版本的 pg_dump 导出;导入前准备新集群与配置;停机窗口可控 |
| 逻辑复制(内置或 pglogical) |
大中型库、要求低/零停机 |
切换秒级 |
需 wal_level=logical、复制槽与扩展支持;可搭建新集群后订阅同步,再切换连接串 |
-
选择建议:
- 追求速度与同机迁移优先 pg_upgrade;
- 跨平台/不确定兼容性优先 逻辑导出/导入;
- 要求近零停机与平滑切换优先 逻辑复制。
四 常见坑与规避
- 扩展不兼容:如 PostGIS、TimescaleDB 等需在新版本单独安装/升级,升级后按需执行扩展升级脚本。
- 配置与目录:新集群需正确设置 postgresql.conf、pg_hba.conf;如新旧并存,使用不同端口;注意 $PGDATA 及日志目录的权限与属主为 postgres。
- 统计信息与索引:升级后用 vacuumdb --all --analyze-in-stages 重建统计信息;若从 PG 10 之前升级,曾使用 hash 索引的需重建。
- 复制与订阅:升级前清理或保留复制槽,避免 WAL 膨胀;使用逻辑复制时,确认两端扩展与参数(如 wal_level=logical)一致。
- 多主版本并存风险:避免端口/目录冲突,切换前在应用侧完成连接串与连接池(如 PgBouncer)验证。
五 升级后验证与回滚
- 快速验证清单:
- 执行 SELECT version(); 确认新版本;
- 抽查关键库/表与视图可用性;
- 检查 /var/log/postgresql/ 日志无异常;
- 运行应用冒烟测试与性能基线对比。
- 统计信息与维护:执行 vacuumdb --all --analyze-in-stages;按需重建索引/物化视图。
- 回滚策略:若采用逻辑迁移或逻辑复制,直接切回旧集群/连接串;若 pg_upgrade 失败或异常,使用事前备份恢复 $PGDATA 与配置文件。