编程 PostgreSQL 19 升级笔记:REPACK CONCURRENTLY、JIT 默认关,以及会让 pg_upgrade 拒绝的几处变更

2026-09-22 20:02:45

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_dumpallpg_upgrade、逻辑复制。PG19 里 pg_upgrade 新增了几处直接拒绝的情况,动手前先查一遍(见「不兼容项」)。

在线运维

REPACK 是 PG19 新增的命令,把 VACUUM FULLCLUSTER 的功能合并到一起:回收磁盘空间并重排表内容。REPACK CONCURRENTLY 能在不阻塞表读写的情况下完成 repack,替代以往必须拿排他锁的场景。旧命令 VACUUM FULLCLUSTER 保留以兼容。并发模式涉及新的服务器变量 max_repack_replication_slots;具体语法与限制以官方文档为准。

数据校验和可以在服务器运行期间启用或禁用。此前只能停库用 pg_checksums 离线改。

autovacuum 引入并行 worker 清理表的索引:

  • autovacuum_max_parallel_workers
  • 每表可设 autovacuum_parallel_workers

同时新增一套评分系统,为最需要 vacuum / analyze 的表排优先级,权重由这些变量控制:

  • autovacuum_freeze_score_weight
  • autovacuum_multixact_freeze_score_weight
  • autovacuum_vacuum_score_weight
  • autovacuum_vacuum_insert_score_weight
  • autovacuum_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 SEQUENCESpg_get_sequence_data() 可查询序列数据。发布侧 CREATE/ALTER PUBLICATION 支持 ALL SEQUENCES 发布所有序列,并可用 EXCEPT 排除表。另有 retain_dead_tuplesmax_retention_durationCREATE SUBSCRIPTION ... SERVER 可直接使用 postgres_fdw 的连接参数。

wal_level=replica 时,逻辑复制可以按需自动启用,不必重启;新变量 effective_wal_level 报告实际生效的 WAL 级别。

默认值变更

这几项不改一行 SQL,但会改变现有集群的行为:

变化
max_locks_per_transaction64 → 128。锁的内存分配方式也变了,若想让实际可用的锁容量与旧版本持平,需要把设置值翻倍
JIT默认关闭。此前默认开启并按优化器代价激活,官方认定该代价评估不可靠;大量分析型查询的站点需手动打开
default_toast_compressionpglz → lz4
log_lock_waits默认开启
空间回收默认路径变为 REPACKVACUUM 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 在服务端强制为 onescape_string_warning 变量被移除。用 PG19 之前的 pg_dump / pg_dumpallstandard_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_durationlog_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,此前只有 VACUUMCOPY ... FREEZE 能做;
  • TID Range Scan 可并行;COPY FROM 文本/CSV 用 SIMD 提速;NOTIFY 只唤醒订阅了对应通知的后端;
  • radix sort 提升排序性能;timing_clock_source 改善计时测量(EXPLAIN ANALYZE\timingpg_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_upgradepg_dumpall、逻辑复制。

动手前先处理这几件事:

  1. 用 PG19(或更新版本)的 pg_dump / pg_dumpall 生成 dump,避开 standard_conforming_strings=off 的老 dump;
  2. 检查是否存在 btree_gist 的 inet/cidr 索引,有则升级前重建为 GiST;
  3. 检查数据库名、角色名、表空间名是否含回车/换行,pg_upgrade 会直接拒绝这类集群;
  4. max_locks_per_transaction 若要保持旧的锁容量,把设置值翻倍;
  5. 依赖 JIT 的分析型负载,升级后显式开启;
  6. 逻辑复制需要序列同步时,用 REFRESH SEQUENCES 让订阅端序列跟上。

命令的具体语法与行为边界以官方文档为准:

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

推荐文章

程序员茄子在线接单