我对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
答案1
背景:WAL(预写日志)是一种确保数据库在崩溃时能够恢复的机制,无需在每次写入后刷新数据文件。基本上,在将任何更改写入数据文件之前,都会先将其记录下来。如果发生崩溃,可以使用日志重做未写入磁盘的任何更改。
pg_xlog 中的每个文件都是一个 WAL 段。checkpoint_segments
和 一起checkpoint_timeout
控制何时完成 WAL 检查点(在checkpoint_segments
段填满或checkpoint_timeout
经过几秒后(以先到者为准)完成检查点);检查点是保证数据文件已被刷新的时间点,因此重做过程不需要考虑检查点之前日志中的任何事务。
根据文档2 * checkpoint_segments + 1
(上面的大部分内容都是从这里抄来的),在 8.3 之前,pg_xlog 目录中通常会有段文件;从 8.3 开始,预期数量是(2 + checkpoint_completion_target) * checkpoint_segments + 1
(或者wal_keep_segments
在 9.0 中,如果这个数字更大)。无论如何,对于checkpoint_segments
64 个段文件,131 个段文件接近预期的最小值。