内容提要
PostgreSQL 19 三月 CommitFest 中与 DBA 课程相关的改进包括:新增 REPACK 命令,合并 VACUUM FULL 与 CLUSTER,并支持 CONCURRENTLY 在线重建;autovacuum 引入按评分排序的优先级机制及并行索引清理;事务 ID 回卷警告提前至一亿事务并显示剩余百分比;检查点完成日志加入原因;可见性映射可在页面访问时更新;新增 pg_stat_lock 锁等待统计视图。
延伸解读
REPACK 命令的在线重建与限制
PostgreSQL 19 引入 REPACK 命令,合并了 VACUUM FULL 和 CLUSTER 的功能,并支持 CONCURRENTLY 选项实现在线重建。但 REPACK(concurrently) 有显著限制:操作期间会持有数据库 horizon,阻止 autovacuum 清理其他表的死元组;无法整体处理分区表,只能针对单个分区;表必须具有主键或 NOT NULL 列上的唯一索引作为 replica identity;不能用于系统目录表和 TOAST 表。使用前需仔细阅读文档。
autovacuum 优先级评分与并行索引清理
PostgreSQL 19 为 autovacuum 引入了基于评分的优先级机制。每个关系根据五个标准分别计算分数,取最高分作为总体分数,并可通过 autovacuum_*_score_weight 参数调整各标准权重(默认均为1)。新增 pg_stat_autovacuum_scores 视图可查看分数详情。此外,autovacuum 现在支持并行处理单个表的索引,通过 autovacuum_max_parallel_workers 参数控制并行工作进程数,默认关闭以保持旧行为。
事务 ID 回卷警告与检查点日志改进
事务 ID 回卷警告现在提前至剩余一亿事务时触发,并显示剩余可用事务 ID 的百分比,帮助 DBA 更直观地判断紧急程度。检查点完成日志现在包含检查点原因(如时间、手动或 WAL 增长触发),便于事后分析。这些改进增强了数据库的可观测性和运维效率。
可见性映射更新与锁等待统计
PostgreSQL 19 允许在页面访问时更新可见性映射,而不仅限于 vacuum 或 COPY FREEZE。页面修剪过程中,如果页面上只剩对所有事务可见的元组,即可设置 all-visible 位,从而减少 vacuum 工作量并降低 WAL 体积。新增 pg_stat_lock 视图,按锁类型累计超过 deadlock_timeout 的锁等待统计,包括等待次数、总等待时间以及 fastpath_exceeded 计数,后者过高时建议增加 max_locks_per_transaction。
Q&A
PostgreSQL 19 中新增的 REPACK 命令有什么作用?它和 VACUUM FULL、CLUSTER 有什么区别?
REPACK 命令合并了 VACUUM FULL 和 CLUSTER 的功能,用于处理表膨胀。REPACK 表名 相当于 VACUUM FULL,重写表并释放空间;REPACK 表名 USING INDEX 索引名 相当于 CLUSTER,还会按索引物理重排行。默认情况下,REPACK 像 VACUUM FULL 和 CLUSTER 一样持有排他锁。
REPACK CONCURRENTLY 有什么限制?
REPACK CONCURRENTLY 的限制包括:整个操作期间持有数据库 horizon,阻止 autovacuum 清理其他表的死元组;不能整体处理分区表,但可以处理单个分区;表需要主键或 NOT NULL 列上的唯一索引作为 replica identity;不能用于系统目录表和 TOAST 表。
PostgreSQL 19 的 autovacuum 优先级机制是如何工作的?
autovacuum 为每个关系根据五个标准分别计算分数,取最高分作为总体分数,并按分数高低决定处理顺序。五个标准对应五个权重参数(autovacuum_*_score_weight),默认均为 1。可以通过调整权重(如 autovacuum_vacuum_score_weight)来改变优先级。将五个权重都设为 0 可禁用优先级系统。
PostgreSQL 19 中事务 ID 回卷警告有什么变化?
事务 ID 回卷警告的触发点从剩余 4000 万事务提前到剩余 1 亿事务。警告信息中除了剩余事务数,还会显示可用事务 ID 的百分比,例如“Approximately 4.66% of transaction IDs are available for use.”,以便 DBA 更直观地判断紧急程度。
PostgreSQL 19 中可见性映射可以在页面访问时更新,这有什么好处?
在 PostgreSQL 19 中,页面修剪(pruning)可以在普通读或写访问时更新可见性映射,设置 all-visible 位。好处是可见性映射不再必须等待 vacuum 更新,常规表操作可以逐页更新它,从而减少 vacuum 的工作量。
PostgreSQL 19 新增的 pg_stat_lock 视图有什么用途?
pg_stat_lock 视图累积统计超过 deadlock_timeout 的锁等待,按锁类型(locktype)聚合。它包含 waits(等待次数)、wait_time(等待时间,毫秒)和 fastpath_exceeded(无法通过快速路径获取锁的次数)等列。如果 fastpath_exceeded 很高,可考虑增加 max_locks_per_transaction。