由 John Doe 九月 12, 2025
你需要手动执行 CHECKPOINT 命令?现在,PostgreSQL 的 CHECKPOINT 命令支持更多选项了。
特性提交日志
为 CHECKPOINT 命令新增 MODE 选项。
该选项可设置为FAST
(默认值)或SPREAD
:
- 设置为
FAST
时,会请求检查点(checkpoint)以最快速度完成; - 设置为
SPREAD
时,会请求检查点在更长时间区间内完成(基于与检查点相关的配置参数)。
需注意,对于并发请求的检查点,服务器可能会合并其选项。例如,若一个会话请求“快速(fast)”检查点,而另一个会话请求“分散(spread)”检查点,服务器可能仅执行一次“快速(fast)”检查点。
为 CHECKPOINT 命令新增 FLUSH_UNLOGGED 选项。
该选项默认处于禁用状态,启用后可请求检查点(checkpoint)同时刷新无日志表(unlogged relations)的脏缓冲区。与MODE
选项类似,对于并发请求的检查点,服务器可能会合并其选项。例如,若一个会话使用(FLUSH_UNLOGGED FALSE
,即不刷新无日志表的脏缓冲区),而另一个会话使用(FLUSH_UNLOGGED TRUE
,即刷新无日志表的脏缓冲区),服务器可能仅执行一次启用FLUSH_UNLOGGED
的检查点(即按刷新无日志表的脏缓冲区的规则执行)。
讨论:https://postgr.es/m/aDnaKTEf-0dLiEfz%40msg.df7cb.de
示例
在 PostgreSQL 中,CHECKPOINT
命令是保障数据一致性的关键特性,它强制将内存中修改过的 “脏缓冲区” 写入磁盘,避免崩溃时数据丢失,并为后续恢复流程建立基础。此前,CHECKPOINT
仅支持快速执行模式,且无法处理无日志表(Unlogged Relation)的缓冲区刷新,在高并发、混合负载场景下缺乏灵活性。
新增的MODE
选项解决了传统CHECKPOINT
一刀切的执行问题,根据业务负载场景,可选择 “快速完成” 或 “分摊负载” 两种模式,核心目标是在 “数据一致性” 与 “系统性能” 间找到最优平衡。
当需要重启 PostgreSQL 实例、切换主从节点或修复磁盘问题时,运维人员通常希望快速完成CHECKPOINT
以减少停机时间。此时MODE FAST
是最优选择,它会优先调度 I/O 资源,最短时间内将脏缓冲区落地,避免恢复时因未写入数据导致的耗时回滚。
CHECKPOINT (MODE FAST);
对于电商大促、金融交易峰值等核心业务时段,传统CHECKPOINT
的高 I/O 可能导致查询延迟升高、交易超时。此时MODE SPREAD
可将检查点负载均匀分散到配置的时间窗口内(例如通过checkpoint_completion_target = 0.9
设置 90% 的周期用于分摊),避免对业务造成冲击。
CHECKPOINT (MODE SPREAD);
无日志表(UNLOGGED TABLE
)是 PostgreSQL 的性能优化特性,它不写入 WAL 日志,写入速度比普通表快,但默认情况下CHECKPOINT
不会刷新其脏缓冲区,崩溃后未落地的数据会丢失。FLUSH_UNLOGGED
选项解决了这一问题,让无日志表的 “性能” 与 “数据安全” 可按需切换。
无日志表常被用于存储报表中间结果、ETL 临时数据等。若这些数据生成耗时较长(如小时级 ETL),崩溃后重新计算会严重影响业务。此时可通过FLUSH_UNLOGGED TRUE
确保临时数据落地,兼顾性能与安全性。
CREATE UNLOGGED TABLE etl_temp (id int, data jsonb);
-- ETL完成后,刷新无日志表的临时结果到磁盘
CHECKPOINT (FLUSH_UNLOGGED TRUE);
非常不错的体验。感谢社区的所有相关人员。
参考
提交日志:https://git.postgresql.org/pg/commitdiff/2f698d7f4b7b4c49c3649b2fcc063eb66f9d2e6c
提交日志:https://git.postgresql.org/pg/commitdiff/8d33fbacbac93ed70757ea47cd8a4b4fae61528a