postgresql 的 checkpoint 初步研究

时间:2021-05-10 10:33:59

os:centos 7.4
postgresql:10.4

checkpoint 是数据库库的重要概念,在检查点时刻,所有脏数据页被刷写到磁盘,并且一个特殊的检查点记录将被写入到日志文件(修改记录之前已经被刷写到WAL文件)。在崩溃时,崩溃恢复过程检查最新的检查点记录用来决定从日志中的哪一点(称为重做记录)开始REDO操作。在这一点之前对数据文件所做的任何修改都已经被保证位于磁盘之上。因此,完成一个检查点后位于包含重做记录的日志段之前的日志段就不再需要了,可以将其回收或删除(当WAL归档工作时,日志段在被回收或删除之前必须被归档)。

下列条件任意之一会导致checkpoint发生:

1、shared_buffers中,产生了 checkpoint_segments*16MB 以上的数据。

2、距离上次checkpoint发生,经过了 checkpoint_timeout * checkpoint_completion_target 秒

3、用户执行checkpoint 命令。

清空checkpoint信息

select * from pg_proc pc where 1=1 and pc.proname like 'pg_stat_reset%' order by pc.proname ;
select pg_stat_reset();
select pg_stat_reset_shared('bgwriter');
select * from pg_class pc where 1=1 and pc.relname like 'pg_stat%' order by pc.relname ;

select * from pg_stat_bgwriter;

查看checkpoint信息

SELECT total_checkpoints, seconds_since_start / total_checkpoints AS seconds_between_checkpoints, seconds_since_stat_reset / total_checkpoints AS seconds_between_checkpoints_stat_reset FROM(SELECT EXTRACT(EPOCH FROM (now() - pg_postmaster_start_time())) AS seconds_since_start, EXTRACT(EPOCH FROM (now() - stats_reset)) AS seconds_since_stat_reset, (checkpoints_timed + checkpoints_req) AS total_checkpoints FROM pg_stat_bgwriter ) AS sub;

参考:
http://blog.2ndquadrant.com/measuring_postgresql_checkpoin/
http://postgres.cn/docs/10/wal-configuration.html
http://postgres.cn/docs/10/monitoring-stats.html