编程 PostgreSQL 19 RC1 升级前要测的事——REPACK 的锁、plan advice 的边界、默认值变化

2026-10-28 20:01:49

PostgreSQL 19 RC1 升级前要测的事——REPACK 的锁、plan advice 的边界、默认值变化

PostgreSQL 19 RC1 于 10 月 15 日发布,RC2 计划 11 月 12 日,GA 计划 11 月 19 日。在这个时间点,生产环境仍应以 PostgreSQL 18 为目标,19 只放在非生产环境里测。

参考:PostgreSQL 19 release notes、PostgreSQL 19 RC1 发布公告、EDB: PostgreSQL 19 — What Changed, What Matters, and What to Test Now

一批特性被回退

多数原定的重大特性从 Beta 4 起被陆续回退:SQL property graph queries、分区表的 merge/split、运行期启停 data checksums。社区追踪列表里还挂着 GROUP BY ALL 和 UPDATE/DELETE ... FOR PORTION OF。

社区给出的理由偏向可靠性和可预测的发布节奏。Peter Eisentraut 的复盘提到几点:部分特性存在架构层面的问题;AI 辅助评审能更快地发现更多边缘 case;资深开发者的大量时间被安全修复占用。2026 年 8 月 PostgreSQL 18 的补丁版本一次性修了 28 个 CVE,而过去一次平均只有一两个。这直接压缩了可用于大特性的时间。

对照升级计划时,别把回退列表当成"下个版本再说"就跳过——如果已有代码或工具链依赖其中某一项,19 上就是缺失状态。

REPACK:concurrent 不等于 lock-free

REPACK 是新命令,用于重写表以回收空间,也可以按索引重组行。REPACK CONCURRENTLY 在大部分执行过程中允许读写继续,期间的并发变更通过 logical decoding 捕获,并在结束前应用。

但 concurrent 不等于 lock-free:最后表与索引的切换仍然需要 ACCESS EXCLUSIVE 锁;执行需要额外的临时磁盘空间;文档还警告,在 repack 开始之前取的快照上,相关事务存在可见性行为问题。

REPACK CONCURRENTLY ;

要测的内容:

  • 选一张有频繁 update/delete 的代表性表,在真实写入和长事务并存的情况下跑。
  • 量回收的空间、临时存储占用、应用侧延迟,以及最后那把锁的实际持续时间;只看"完成时间"没有意义。
  • 保留回滚计划。

pg_plan_advice:约束而不是提速

pg_plan_advice 用来描述、复现和约束具体的计划器决策,包括 join order 和扫描方式。模块加载后,EXPLAIN (PLAN_ADVICE) 可以生成 advice 字符串;配套的 pg_stash_advice 扩展按 query identifier 存储 advice 并自动应用。

EXPLAIN (PLAN_ADVICE) SELECT ...;

它不是通用的性能开关,也不保证任何情况下都得到相同的执行计划。plan advice 只是约束计划器可考虑的选择范围,数据分布变化之后,曾经有效的限制可能反过来阻止计划器选择更优方案。文档明确警告不要不加权衡地覆盖计划器决策。

要测的起点是历史上出现过计划回归的查询:用有代表性的数据和参数值,比较正常选择与窄范围 advice 的差别。干预范围尽量小,负载变化后复查这些 advice 是否还有用。

autovacuum:并行与打分

autovacuum 现在可以用并行 worker 做索引 vacuum 和 cleanup;同时引入打分机制给 vacuum/analyze 排优先级,pg_stat_autovacuum_scores 视图暴露优先级。

SELECT * FROM pg_stat_autovacuum_scores;

并行是有针对性的,不是所有阶段全并行。

测试时把频繁更新的繁忙表和更大、更不活跃的表混在一起,观察分数、看哪些工作被优先处理,再对比维护时长与应用延迟、资源消耗的变化。

逻辑复制序列同步

创建 subscription 时可以执行初始同步,之后用 ALTER SUBSCRIPTION ... REFRESH SEQUENCES 重新同步已知序列。

ALTER SUBSCRIPTION  REFRESH SEQUENCES;

边界条件要记清楚:

  • publisher 必须是 PostgreSQL 19 及以上,只升级 subscriber 没有用。
  • 序列值会随着 publisher 继续推进而再次不一致。这不是持续同步,不能替代切换流程的设计。

要测的是迁移/切换流程里序列这一段:检查序列定义是否一致、同步是否完成、应用到订阅端之后会生成什么值。测的是整个工作流,而不只是命令是否执行成功。

默认值与兼容性变化

release notes 的迁移章节列出的项目,逐条对照:

  • JIT 编译默认关闭。此前默认开启并按代价触发,该代价模型被判为不可靠。依赖 JIT 的分析型负载需要显式评估。
  • max_locks_per_transaction 默认值从 64 改成 128,锁大小的分配方式也变了,等效容量需要重新换算。
  • inet/cidr 的默认索引 opclass 从 btree_gist 改为 GiST。btree_gist 版本本身有 bug,会漏行;pg_upgrade 会拒绝升级存在 btree_gist inet/cidr 索引的集群。
  • standard_conforming_strings 强制为 on。用旧版 pg_dump 在 off 状态下生成的 dump 无法正常导入 19。
  • 数据库、角色、表空间名不允许回车和换行,pg_upgrade 同样会拒绝这类集群。
  • 移除 RADIUS 支持;移除 MULE_INTERNAL 编码;json_array() 在无行时返回空数组而不是 NULL;pg_stat_subscription_stats 的 sync_error_count 改名为 sync_table_error_count;wait event 类型 BUFFERPIN 改名为 BUFFER。
  • ON CONFLICT DO SELECT ... RETURNING 可以返回并可选锁住冲突行;窗口函数支持 IGNORE NULLS。
  • WAIT 命令让备库等待 LSN 被写入、刷盘或回放,实现 read-your-writes。

怎么测

搭一个反映真实部署的非生产环境:应用查询、扩展、驱动、数据分布、维护例程都要在里面,包含升级与恢复演练,而不只是特性演示。RC 仍是测试版本,不是生产推荐。

复制全文 生成海报 PostgreSQL 数据库升级 运维 复制

推荐文章

程序员茄子在线接单