PostgreSQL 19 升级笔记:REPACK CONCURRENTLY、JIT 默认关,以及会让 pg_upgrade 拒绝的几处变更
官方 release notes:
状态与升级前提
PostgreSQL 19 的 release notes 标注发布日期为 2026-??-??,AS OF 2026-07-18;Beta 3 已于 2026-08-13 发布,同期发布 18.6 / 17.11 / 16.15 / 15.19 / 14.24 小版本。InfoQ 报道预计 2026 年 9 月 GA。
从旧版本迁移仍走三条路:pg_dumpall、pg_upgrade、逻辑复制。PG19 里 pg_upgrade 新增了几处直接拒绝的情况,动手前先查一遍(见「不兼容项」)。
在线运维
REPACK 是 PG19 新增的命令,把 VACUUM FULL 和 CLUSTER 的功能合并到一起:回收磁盘空间并重排表内容。REPACK CONCURRENTLY 能在不阻塞表读写的情况下完成 repack,替代以往必须拿排他锁的场景。旧命令 VACUUM FULL、CLUSTER 保留以兼容。并发模式涉及新的服务器变量 max_repack_replication_slots;具体语法与限制以官方文档为准。
数据校验和可以在服务器运行期间启用或禁用。此前只能停库用 pg_checksums 离线改。
autovacuum 引入并行 worker 清理表的索引:
autovacuum_max_parallel_workers- 每表可设
autovacuum_parallel_workers
同时新增一套评分系统,为最需要 vacuum / analyze 的表排优先级,权重由这些变量控制:
autovacuum_freeze_score_weightautovacuum_multixact_freeze_score_weightautovacuum_vacuum_score_weightautovacuum_vacuum_insert_score_weightautovacuum_analyze_score_weight
每表评分明细可在 pg_stat_autovacuum_scores 中查看。
复制与读己写一致
新增 WAIT FOR 命令,让备库等待指定 LSN 被写入 / 刷盘 / 重放,从而在备库上实现 read-your-writes:写主库、读备库时不会读到旧数据。
流复制与槽相关:
pg_sync_replication_slots()等待同步完成;- 新增
wal_sender_shutdown_timeout; wal_receiver_timeout可按订阅和用户设置。
逻辑复制现在会复制序列值。订阅端可以让序列与发布者保持一致,入口是 CREATE SUBSCRIPTION 以及 ALTER SUBSCRIPTION ... REFRESH PUBLICATION / ... REFRESH SEQUENCES,pg_get_sequence_data() 可查询序列数据。发布侧 CREATE/ALTER PUBLICATION 支持 ALL SEQUENCES 发布所有序列,并可用 EXCEPT 排除表。另有 retain_dead_tuples 与 max_retention_duration。CREATE SUBSCRIPTION ... SERVER 可直接使用 postgres_fdw 的连接参数。
wal_level=replica 时,逻辑复制可以按需自动启用,不必重启;新变量 effective_wal_level 报告实际生效的 WAL 级别。
默认值变更
这几项不改一行 SQL,但会改变现有集群的行为:
| 项 | 变化 |
|---|---|
max_locks_per_transaction | 64 → 128。锁的内存分配方式也变了,若想让实际可用的锁容量与旧版本持平,需要把设置值翻倍 |
| JIT | 默认关闭。此前默认开启并按优化器代价激活,官方认定该代价评估不可靠;大量分析型查询的站点需手动打开 |
default_toast_compression | pglz → lz4 |
log_lock_waits | 默认开启 |
| 空间回收 | 默认路径变为 REPACK,VACUUM FULL / CLUSTER 作为兼容保留 |
SQL 新语法
- SQL/PGQ(property graph queries):支持属性图查询,内部按视图处理,最终改写成标准关系查询。
FOR PORTION OF:支持时态更新和删除。INSERT ... ON CONFLICT DO SELECT ... RETURNING:可返回冲突行,并能用FOR UPDATE/FOR SHARE对冲突行加锁。- 窗口函数
IGNORE NULLS/RESPECT NULLS:适用于lead/lag/first_value/last_value/nth_value。 GROUP BY可处理引用非子查询列的目标列子查询。
pg_plan_advice 扩展用于稳定/控制查询规划器决策,配套 pg_stash_advice 按查询自动应用建议。
不兼容项
standard_conforming_strings在服务端强制为 on,escape_string_warning变量被移除。用 PG19 之前的pg_dump/pg_dumpall在standard_conforming_strings=off下生成的 dump 无法正确载入 PG19+;应改用 PG19 或更新版本的pg_dump,或保证导出时standard_conforming_strings=on。- 移除 RADIUS 支持。原实现只支持 UDP RADIUS,官方认为其不安全性无法修复。
- inet/cidr 的默认索引 opclass 从 btree_gist 改为 GiST。btree_gist 的 inet/cidr opclass 有缺陷,可能漏行;
pg_upgrade会拒绝带 btree_gist inet/cidr 索引的集群,升级前需重建索引。 - 移除 MULE_INTERNAL 编码。
- 禁止在数据库名、角色名、表空间名中使用回车和换行;
pg_upgrade也会拒绝这类集群。 - MD5 密码认证成功后发出警告,可用
md5_password_warnings关闭(MD5 密码在 PG18 已弃用);新增password_expiration_warning_threshold,默认 7 天。 CREATE SCHEMA不再重排对象顺序。- 禁止在
COPY FROM ... WHERE中使用系统列。 json_array()在无行时返回空 JSON 数组(原来返回 NULL)。- postgres_fdw 会话继承事务的 READ ONLY / DEFERRABLE 状态。
pg_stat_subscription_stats.sync_error_count改名为sync_table_error_count(序列错误现在单独跟踪)。- wait event 类型
BUFFERPIN改名为BUFFER。 - 索引访问方法 handler 改为静态
IndexAmRoutines结构。 - 移除优化器钩子
get_relation_info_hook,新增build_simple_rel_hook。 - psql 的
\crosstabview遵循\pset null。
观测性
新增视图:
pg_stat_lock与函数pg_stat_get_lock():按锁类型统计;pg_stat_recovery:恢复状态;pg_stat_dsm_registry_allocations;pg_stat_autovacuum_scores:每表 autovacuum 详情。
已有视图扩展:
pg_stat_progress_vacuum增加started_by/mode;pg_stat_progress_analyze增加started_by;pg_stat_replication_slots增加mem_exceeded_count与 slot sync 跳过信息;pg_stat_subscription_stats增加update_deleted/sync_seq_error_count;pg_stat_all_tables等增加stats_reset;pg_stat_progress_basebackup增加backup_type;pg_stat_wal报告 full page image 的 WAL 字节数。
日志侧:log_min_messages 可按进程类型指定(type:level);新增 log_autoanalyze_min_duration(log_autovacuum_min_duration 只管 vacuum);log_lock_waits 默认开启;新增 debug_print_raw_parse;远程服务器消息在日志中与本地同格式。VACUUM (VERBOSE) 与 autovacuum 日志会报告内存使用与并行度。
优化器与性能
NOT IN在无 NULL 时可转 ANTI JOIN,更多 LEFT JOIN 也能转 ANTI JOIN;- ANTI JOIN 唯一内侧可用 Memoize;部分聚合可下推到 join 前;支持增量排序;
IS [NOT] DISTINCT FROM在可证明非空时简化为<>/=;- 外键约束检查改为批量索引探测,官方给出的数字是存在外键检查时插入性能最高提升 2 倍;
- 异步 I/O 的大请求预读调度改进;
io_method=worker可自动控制后台 worker,新变量io_min_workers/io_max_workers/io_worker_idle_timeout/io_worker_launch_interval; - 查询表扫描可把页标记 all-visible,此前只有
VACUUM和COPY ... FREEZE能做; - TID Range Scan 可并行;
COPY FROM文本/CSV 用 SIMD 提速;NOTIFY只唤醒订阅了对应通知的后端; - radix sort 提升排序性能;
timing_clock_source改善计时测量(EXPLAIN ANALYZE、\timing、pg_test_timing)。
配置与实用命令
ALTER TABLE ... MERGE/SPLIT PARTITIONS;GRANT/REVOKE支持GRANTED BY,指定执行权限调整的有效角色;CREATE SCHEMA可创建更多类型的对象;CHECKPOINT接受MODE/FLUSH_UNLOGGED选项;- 服务端 SNI 支持(
PGDATA/pg_hosts.conf); pg_read_all_data/pg_write_all_data角色可读写 large object;- GB18030 编码从 2000 升级到 2022。
升级方式与注意
升级路径:pg_upgrade、pg_dumpall、逻辑复制。
动手前先处理这几件事:
- 用 PG19(或更新版本)的
pg_dump/pg_dumpall生成 dump,避开standard_conforming_strings=off的老 dump; - 检查是否存在 btree_gist 的 inet/cidr 索引,有则升级前重建为 GiST;
- 检查数据库名、角色名、表空间名是否含回车/换行,
pg_upgrade会直接拒绝这类集群; max_locks_per_transaction若要保持旧的锁容量,把设置值翻倍;- 依赖 JIT 的分析型负载,升级后显式开启;
- 逻辑复制需要序列同步时,用
REFRESH SEQUENCES让订阅端序列跟上。
命令的具体语法与行为边界以官方文档为准: