<aside> 🐘

本页把“最新版本”落到可执行的迁移和运维动作:先识别版本差异,再演练升级;生产升级必须有回退路径。

</aside>

PostgreSQL 18.4 基线

PostgreSQL 18 重点变化

领域 变化 实践影响
I/O 异步 I/O 子系统;默认 io_method=worker 结合 pg_stat_io、pg_aios 和延迟指标验证,不盲目调参
优化器 B-tree skip scan 等优化 升级后重新采样并对关键 SQL 比较计划
标识符 内置 uuidv7() 时间有序 UUID 可减少随机写放大,但先评估业务语义
生成列 虚拟生成列成为默认 检查依赖存储生成值的旧设计与权限
安全 OAuth 认证能力增强 仍需 TLS、身份提供商和客户端能力共同配合
初始化 initdb 默认启用数据校验和 校验备份、监控校验和错误,评估 I/O 成本
升级 pg_upgrade 可保留优化器统计 仍要验证统计、扩展与执行计划,不等于免回归

升级方式选择

  1. 小版本更新(18.x → 18.y):停库替换二进制后启动;无需 pg_upgrade,但先读发行说明并备份。
  2. pg_upgrade:停机窗口短,适合同机或新机本地迁移;需要新旧二进制、兼容扩展和严格检查。
  3. 逻辑复制:可跨大版本、停机短,适合分批切换;DDL、序列、大对象和未记录表需另行处理。
  4. 导出/导入:最干净、最慢,适合小库或结构重整。

pg_upgrade 标准演练

<aside> ⚠️

下列是流程骨架,路径必须按发行版修改。禁止把首次演练放在生产窗口。

</aside>

# 1. 记录对象、扩展与容量
psql -d app -c "\dx"
pg_dumpall --globals-only > globals.sql
pg_dump -Fc -d app -f app-preupgrade.dump

# 2. 停止写入并执行兼容性检查
pg_ctl -D /data/pg-old stop
/usr/pgsql-18/bin/pg_upgrade --check   --old-bindir=/usr/pgsql-17/bin   --new-bindir=/usr/pgsql-18/bin   --old-datadir=/data/pg-old   --new-datadir=/data/pg-new

# 3. 正式升级(是否使用 link 模式取决于回退策略)
/usr/pgsql-18/bin/pg_upgrade   --old-bindir=/usr/pgsql-17/bin   --new-bindir=/usr/pgsql-18/bin   --old-datadir=/data/pg-old   --new-datadir=/data/pg-new

升级后必须完成: