PostgreSQL 19: 在线启用与禁用数据校验和

John Doe 四月 13, 2026

之前,PostgreSQL 数据校验和只能在初始化或停机状态下进行配置。而现在,新版本实现了运行中实例在线启用 / 禁用数据校验和的能力,让 7×24 小时运行的核心业务实例也能零停机获得数据完整性保护。

image

特性提交日志

在线启用与禁用数据校验和。

本特性支持在运行中的数据库集群上启用或禁用数据校验和,且处理期间无需限制集群访问。

在此之前,数据校验和仅能在 initdb 初始化阶段启用,或在集群离线状态下通过 pg_checksums 工具启用。本次提交新增了相关功能,可在集群运行时直接启用或禁用数据校验和,与集群初始化方式无关。

一个后台工作进程启动器负责为每个数据库动态启动专属后台工作进程,该进程会将所有带存储的关系(relation)的所有缓冲区标记为脏页,以便在写入时计算数据校验和。待所有数据库中的所有关系处理完成后,data_checksums 状态会被设为开启,此时集群状态与初始化时启用数据校验和、或通过离线方式启用校验和的集群完全一致。

启用数据校验和期间,除数据校验和后台进程外,其他后端进程发起的并发 I/O 操作会写入校验和,但读取时不会进行校验。只有当所有后端进程都接收并处理完用于设置 data_checksums 为开启状态的进程信号屏障后,才会在读取时开始校验校验和。禁用过程同理:所有后端进程会继续写入校验和,但不执行校验,直到所有进程都处理完设置状态为关闭的屏障。这种中间过渡状态用于避免因读取与页面不同步的校验和而产生误判(漏报或误报)。

讨论:https://postgr.es/m/CABUevExz9hUUOLnJVr2kpw9Cx=o4MCr1SVKwbupzuxP7ckNutA@mail.gmail.com

数据校验和的痛点

数据校验和(Data Checksums)是 PostgreSQL 防范静默数据损坏的核心机制,通过为每个数据页计算校验和并在读取时验证,能及时发现磁盘、存储、内存等硬件导致的无声数据错误,避免错误数据扩散引发业务灾难。

但在此之前,PostgreSQL 的数据校验和存在致命的使用限制:

  • 只能在initdb集群初始化阶段通过--data-checksums参数开启
  • 初始化后如需开启,必须完全停机,使用pg_checksums --enable命令离线计算所有页面的校验和
  • 对于 TB 级甚至 PB 级的生产集群,离线处理过程可能持续数小时甚至数天,业务完全中断

这一限制导致绝大多数历史遗留生产集群、无法容忍长停机的核心业务集群,被迫放弃数据校验和保护,长期暴露在静默数据损坏的风险之下。而本次合入的在线开关特性,彻底解决了这一痛点。

特性示例

例如某金融机构有个核心交易实例,连续运行 5 年,数据量 3TB,初始化时未开启数据校验和,此前因无法承受停机风险一直未补开。

我们可以在业务低峰期,先将 PostgreSQL 版本升级到 19,再执行在线启用命令,启用过程中不影响交易处理。

-- 凌晨2点业务低峰期执行
ALTER SYSTEM SET data_checksums = on;

-- 监控启用数据校验的进度
SELECT pid, backend_type, query
FROM pg_stat_activity
WHERE backend_type = 'datachecksum worker';

后台进程耗时约 2 小时完成所有页面处理,期间交易系统 TPS、响应时间无明显波动,切换完成后自动开启数据页校验,彻底消除静默数据损坏风险。

非常不错的体验,感谢所有参与的社区人员,PostgreSQL 19 值得期待。

参考

提交日志:https://git.postgresql.org/pg/commitdiff/f19c0eccae9680f5785b11cdc58ef571998caec9