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 PARTITIONSpg_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。