资讯 PostgreSQL 19 RC1 升级笔记:REPACK 取代 VACUUM FULL/CLUSTER,JIT 默认关闭,max_locks_per_transaction 64→128

2026-10-18 21:04:03

PostgreSQL 19 RC1 升级笔记:REPACK 取代 VACUUM FULL/CLUSTER,JIT 默认关闭,max_locks_per_transaction 64→128

PostgreSQL 19 RC1 于 2026-10-15 发布,GA 计划 2026-11-19;RC2 在 2026-11-12 与 update release 一起发布。大版本升级仍走 pg_upgrade 或 pg_dump/pg_restore。

19 的主要变化

  • 新增 REPACK 命令,用于回收磁盘空间、重组表内容,改善查询性能;REPACK (CONCURRENTLY) 不阻塞读写。它取代 VACUUM FULL 和 CLUSTER,旧命令为兼容保留。
  • pg_plan_advice 扩展用于控制查询计划器决策;pg_stash_advice 根据查询自动应用计划建议。
  • I/O worker 进程数自动伸缩(io_method=worker、io_min_workers/io_max_workers);外键检查更快,有 FK 检查时插入性能最高提升 2 倍;规划/执行优化。
  • 当 wal_level 为 replica 时,逻辑复制可以免重启启用;新增只读参数 effective_wal_level。
  • 序列值可逻辑复制:ALL SEQUENCES、REFRESH SEQUENCES、pg_get_sequence_data()。
  • WAIT / WAIT FOR LSN 用于在备库上实现读己之写一致性。
  • 表索引并行 autovacuum(autovacuum_max_parallel_workers),新的评分系统用于 autovacuum 优先级(pg_stat_autovacuum_scores)。

REPACK:替代 VACUUM FULL 和 CLUSTER

REPACK 回收空间并重组表内容。带 CONCURRENTLY 时允许并发读写。旧命令 VACUUM FULL、CLUSTER 仍保留。新增服务器变量 max_repack_replication_slots。

REPACK (CONCURRENTLY) orders;
SHOW max_repack_replication_slots;

逻辑复制:wal_level=replica 下免重启、序列值、WAIT FOR LSN

wal_level 为 replica 时即可启用逻辑复制,不再要求重启服务器。effective_wal_level 是只读参数,用于查看实际生效的 WAL 级别。

SHOW wal_level;            -- replica
SHOW effective_wal_level;  -- 只读

序列值逻辑复制:

CREATE PUBLICATION pub FOR ALL SEQUENCES;
ALTER SUBSCRIPTION sub REFRESH SEQUENCES;
SELECT pg_get_sequence_data('public.orders_id_seq');

备库读己之写:

WAIT FOR LSN '0/16B3748';

升级前要改的默认值

max_locks_per_transaction:64 → 128

默认值从 64 改为 128。锁大小分配方式也变了,旧版本上的设置需要按容量翻倍的口径理解,不能直接照搬。

SHOW max_locks_per_transaction; -- 128
ALTER SYSTEM SET max_locks_per_transaction = 128;

JIT 默认关闭

JIT 以前默认开启,并按优化器成本决定是否启用;该成本估算被判定为不可靠,因此 19 默认关闭。大量分析查询的实例需要手动开启。

SHOW jit; -- off
ALTER SYSTEM SET jit = on;

standard_conforming_strings 强制 on

服务器端强制 standard_conforming_strings 始终为 on,escape_string_warning 被移除。pre-19 的 pg_dump/pg_dumpall 在 standard_conforming_strings=off 下生成的 dump 无法正确导入 19+。

SHOW standard_conforming_strings; -- on

其他默认值

default_toast_compression 默认改为 lz4;password_expiration_warning_threshold 默认 7 天。

SHOW default_toast_compression;             -- lz4
SHOW password_expiration_warning_threshold; -- 7d

不兼容与 pg_upgrade 检查

  • 移除 RADIUS 支持。此前只支持 RADIUS over UDP,安全性无法修复。
  • inet、cidr 的默认索引 opclass 从 btree_gist 改为 GiST。btree_gist 的 inet/cidr opclass 有缺陷,可能排除本应返回的行;pg_upgrade 拒绝升级带此类索引的集群。需要重建为 GiST:
DROP INDEX idx_t_ip;
CREATE INDEX idx_t_ip ON t USING gist (ip);
  • 数据库名、角色名、表空间名禁止包含回车和换行;pg_upgrade 也拒绝升级这类集群。
  • MD5 密码认证成功后会告警;可通过 md5_password_warnings 关闭。MD5 在 18 已弃用。
SET md5_password_warnings = off;
  • 移除 MULE_INTERNAL 编码。
  • pg_stat_subscription_stats 的列 sync_error_count 重命名为 sync_table_error_count。
  • wait event 类型 BUFFERPIN 重命名为 BUFFER。
  • 移除优化器 hook get_relation_info_hook,新增 build_simple_rel_hook。
  • 事务会把 READ ONLY 和 DEFERRABLE 状态传给 postgres_fdw 会话;只读事务不能再修改由 postgres_fdw 会话处理的行。
  • json_array() 无行返回时返回空 JSON 数组,而不是 NULL。
  • psql \crosstabview 遵循 \pset null。

其他命令与语法

CHECKPOINT 接受选项列表 MODE、FLUSH_UNLOGGED:

CHECKPOINT (MODE, FLUSH_UNLOGGED);

GROUP BY ALL:

SELECT region, count(*) FROM orders GROUP BY ALL;

INSERT ... ON CONFLICT DO SELECT ... RETURNING,冲突行会被返回,可用 FOR UPDATE/SHARE 加锁:

INSERT INTO t VALUES (...)
ON CONFLICT DO SELECT ... RETURNING ...;

GRANT/REVOKE 支持 GRANTED BY:

GRANT SELECT ON t TO alice GRANTED BY bob;

窗口函数支持 IGNORE NULLS / RESPECT NULLS,适用于 lead、lag、first_value、last_value、nth_value:

SELECT lead(ts) IGNORE NULLS OVER (ORDER BY id) FROM events;

COPY (query) TO ... (FORMAT json) 使用查询的列名/别名作为 JSON key:

COPY (SELECT id, name FROM t) TO STDOUT (FORMAT json);

EXPLAIN ANALYZE 通过 IO 选项显示 AIO 统计:

EXPLAIN (ANALYZE, IO) SELECT ...;

统计与可观测性

  • 新增 pg_stat_lock、pg_stat_recovery 视图;许多视图增加 stats_reset 列。
  • pg_stat_progress_vacuum/analyze 增加 started_by,vacuum 增加 mode。
  • log_min_messages 可按进程类型设置。
  • VACUUM/ANALYZE 日志记录 WAL full page write 字节数。
  • SNI:服务端通过 pg_hosts.conf 按主机名使用不同 TLS 证书。
  • 并行 autovacuum 与评分视图:
SELECT * FROM pg_stat_autovacuum_scores;

Beta 4 撤回了什么

Beta 4 为保证可靠性和可预测的发布节奏撤回了几项功能:

  • SQL/PGQ property graph 查询
  • temporal FOR PORTION OF UPDATE/DELETE
  • ALTER TABLE ... MERGE PARTITIONS / SPLIT PARTITIONS
  • pg_get_role_ddl()、pg_get_tablespace_ddl()、pg_get_database_ddl()
  • 在线启用/禁用 data checksums
  • postmaster 中强制 LC_COLLATE 为 C 的改动

RC1 相对 Beta 4 的修复

  • REPACK (CONCURRENTLY) 多项修复
  • pg_plan_advice 修复
  • 依赖表达式可空性的新 planner 优化
  • wal_level=replica 时自动启用逻辑复制
  • postgres_fdw 统计导入以外部表 owner 身份运行,而不是执行 ANALYZE 的用户
  • 并行 autovacuum 修复
  • COPY (query) TO ... (FORMAT json) 使用查询的列名/别名作为 JSON key

升级路径

大版本升级需要 pg_upgrade 或 pg_dump/pg_restore。升级前重点核对 btree_gist 的 inet/cidr 索引、对象名中的回车换行、max_locks_per_transaction 的容量口径,以及是否需要为分析型实例重新开启 JIT。

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

推荐文章

程序员茄子在线接单