一个 检查点
是一个操作,它将内存中所有“脏”(已更改或新的)数据页刷新到磁盘数据文件。它保证了在检查点之前写入 WAL 中的所有更改都存在于数据文件中。
如果服务器发生崩溃,崩溃恢复过程将从 WAL 中恢复更改,从最近的 检查点
之后立即开始,其位置记录在 pg_control
中。
自动检查点
检查点通常由 检查点进程 自动执行,通常以固定的时间间隔执行(但是,如果系统自上次检查点以来一直处于空闲状态,则会跳过检查点)。
检查点会导致 I/O 负载出现峰值,因此在调整 PostgreSQL 服务器性能时,检查点配置是一个重要的考虑因素。
以下参数会影响检查点的执行频率
此外,可以调整 checkpoint_completion_target
以分散检查点过程,减少检查点产生的 I/O 量。
请注意,无法禁用检查点进程,这样做也没有意义;但是,通过将 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
检查点进程
服务器进程已添加 (提交 bf405ba8)- 以下与检查点相关的列已添加到
pg_stat_bgwriter
(提交 b736aef2)
checkpoint_sync_time
checkpoint_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:什么是检查点? - CyberTec 于 2021 年 2 月发布的博文
- PostgreSQL 中的检查点 - High Go 于 2020 年 12 月发布的博文
- 调整检查点的基础知识 - 2ndQuadrant 于 2016 年 11 月发布的博文