关于 checkpoint_segments 参数

4 postgresql

“checkpoint_segments”这个参数我不是很了解,我个人的看法是它的意思是wal日志文件的数量;我把参数的值配置为64,但是在pg_xlog目录下可以看到131个文件。

有人能解释一下参数吗?

--detail
postgres=# show checkpoint_segments;
 checkpoint_segments 
---------------------
 64
(1 row)

[postgres@pg_root]$ cd $PGDATA
[postgres@pg_root]$ ls -lrt pg_xlog | wc -l
132
Run Code Online (Sandbox Code Playgroud)

小智 6

对于背景:WAL(预写日志记录)是一种机制,可确保在发生崩溃时可以恢复数据库,而无需在每次写入后刷新数据文件。基本上,在将任何更改写入数据文件之前,首先将其记录下来。如果发生崩溃,日志可用于重做未写入磁盘的任何更改。

pg_xlog 中的每个文件都是一个 WAL 段。checkpoint_segments, 以及checkpoint_timeout, 控制何时完成 WAL 检查点(checkpoint_segments在填充段或checkpoint_timeout经过几秒钟后完成检查点,以先到者为准);检查点是保证数据文件已被刷新的时刻,因此重做过程不需要考虑检查点之前日志中的任何事务。

根据文档(这是我从中抄录了大部分内容的地方),在 8.3 之前,2 * checkpoint_segments + 1pg_xlog 目录中通常会有段文件;从 8.3 开始,预期的数字是(2 + checkpoint_completion_target) * checkpoint_segments + 1(或wal_keep_segments9.0,如果更大)。在任何情况下,对于checkpoint_segments64 的131 个段文件接近预期的最小值。