一个 检查点 操作,它会将内存中所有“脏的”(已更改或新的)数据页刷新到磁盘上的数据文件中。可以保证,直到检查点为止在 WAL 中记录的所有更改都已存在于数据文件中。
如果发生服务器崩溃,崩溃恢复过程将从 WAL 中恢复更改,从最近一个检查点之后立即开始,该检查点的位置记录在 pg_control 中。
自动检查点
检查点通常由 checkpointer 进程以固定的时间间隔自动执行(但是,如果自上次检查点以来系统一直处于空闲状态,则会跳过)。
检查点会导致 I/O 负载峰值,因此在调整 PostgreSQL 服务器性能时,检查点配置是一个重要的考虑因素。
以下参数会影响检查点的执行频率
此外,可以调整 checkpoint_completion_target 来分散检查点过程,从而减少检查点产生的 I/O 量。
请注意,无法禁用 checkpointer,这样做也没有任何意义;但是,通过将 checkpoint_timeout 设置为 1d(一天,最大值),并将 max_wal_size 设置为非常大的值,可以在很长一段时间内延迟定期检查点,例如用于测试目的。
文档部分 WAL 配置 提供了对检查点过程的绝佳概述。
手动检查点
数据库超级用户可以通过 CHECKPOINT 命令手动强制执行检查点,但在正常操作中通常不需要这样做。
检查点信息
有关当前检查点状态的信息可以通过 pg_control_checkpoint() 函数(PostgreSQL 9.6 及更高版本)或从 pg_control 文件中检索。
日志记录
默认情况下,例行检查点不被记录。将 log_checkpoints 设置为 “on” 以启用检查点日志记录(请参见该条目以获取示例)。
由检查点超时触发的检查点的典型日志输出
[2021-03-29 05:45:49 UTC] LOG: checkpoint starting: time [2021-03-29 05:46:04 UTC] LOG: checkpoint complete: wrote 155 buffers (0.1%); 0 WAL file(s) added, 0 removed, 0 recycled; write=15.810 s, sync=0.013 s, total=15.904 s; sync files=63, longest=0.003 s, average=0.000 s; distance=783 kB, estimate=2315 kB
变更历史
进行中
- PostgreSQL 14
checkpoint_completion_target的默认值从0.5更改为0.9(提交 bbcc4eb2)
- PostgreSQL 9.6
- 添加了
pg_control_checkpoint()函数(提交 dc7d70ea) checkpoint_timeout的最大值从一小时更改为一天(提交 f2dba881)- 添加了
checkpoint_flush_after(提交 428b1d6b)
- 添加了
- PostgreSQL 9.5
- 添加了
max_wal_size(提交 88e98230) - 移除了
checkpoint_segments(提交 88e98230)
- 添加了
- PostgreSQL 9.2
- 添加了
checkpointer服务器进程(提交 bf405ba8) - 向
pg_stat_bgwriter添加了以下与检查点相关的列(提交 b736aef2)
checkpoint_sync_timecheckpoint_write_time
- 添加了
- PostgreSQL 8.3
- 添加了
checkpoint_completion_target(提交 867e2c91) - 添加了
log_checkpoints(提交 9fc25c05) - 添加了
pg_stat_bgwriter(提交 335feca4)
- 添加了
- PostgreSQL 7.4
- 添加了
checkpoint_warning(提交 2986aa6a)
- 添加了
- PostgreSQL 7.1
- 添加了自动检查点(提交 b0299c5d)
- 添加了
checkpoint_segments(提交 4d14fe00) - 添加了
checkpoint_timeout(提交 b0299c5d) - 添加了
CHECKPOINT命令(提交 f0e37a85)
有用链接
- PostgreSQL:什么是检查点? - 2021 年 2 月 CyberTec 的博客文章
- PostgreSQL 中的检查点 - 2020 年 12 月 High Go 的博客文章
- 调整检查点基础知识 - 2016 年 11 月 2ndQuadrant 的博客文章
