一、检查点的作用
1、定期保存修改过的数据块
检查点发生时,checkpoint进程会把共享缓冲区中的脏块写入磁盘,永久保存,以防主机断电等故障导致的数据丢失。此频率由参数checkpoint_timeout控制。
2、作为实例恢复的起点
当实例发生崩溃后,再次启动需进行实例恢复,此时数据库将以最近一次ckpt的位置作为参考,开始recovery。
3、作为介质恢复的起点
每次物理备份时都会生成一个检查点,用于判断将来恢复时的起点。
因为备份时数据文件存在先后顺序,导致备份得到的数据文件不一致,所以将来恢复时,需要应用归档日志使其同步,此时,开始备份的位置就是将来recovery的位置。
二、检查点的工作原理
1、XLOG写记录
在pg中,xlog记录即事务记录,而检查点记录也是一次事务记录。
2、检查点记录的位置
(1)控制文件
控制文件中记录了检查点的相关信息。查看方式:
cd /usr/pgsql-14/bin
./pg_controldata /data/postgresql/data
-bash-4.2$ ./pg_controldata /data/postgresql/data/
pg_control 版本: 1300
Catalog 版本: 202107181
数据库系统标识符: 7205807020200909141
数据库簇状态: 在运行中
pg_control 最后修改: 2024年02月27日 星期二 16时10分01秒
最新检查点位置: 2/78000098
最新检查点的 REDO 位置: 2/78000060
最新检查点的重做日志文件: 000000010000000200000078
最新检查点的 TimeLineID: 1
最新检查点的PrevTimeLineID: 1
最新检查点的full_page_writes: 开启
最新检查点的NextXID: 0:31851
最新检查点的 NextOID: 25018
最新检查点的NextMultiXactId: 1
最新检查点的NextMultiOffsetD: 0
最新检查点的oldestXID: 727
最新检查点的oldestXID所在的数据库: 1
最新检查点的oldestActiveXID: 31851
最新检查点的oldestMultiXid: 1
最新检查点的oldestMulti所在的数据库: 1
最新检查点的oldestCommitTsXid: 0
最新检查点的newestCommitTsXid: 0
最新检查点的时间: 2024年02月27日 星期二 16时10分00秒
不带日志的关系: 0/3E8使用虚假的LSN计数器
最小恢复结束位置: 0/0
最小恢复结束位置时间表: 0
开始进行备份的点位置: 0/0
备份的最终位置: 0/0
需要终止备份的记录: 否
wal_level设置: replica
wal_log_hints设置: 关闭
max_connections设置: 100
max_worker_processes设置: 8
max_wal_senders设置: 10
max_prepared_xacts设置: 0
max_locks_per_xact设置: 64
track_commit_timestamp设置: 关闭
最大数据校准: 8
数据库块大小: 8192
大关系的每段块数: 131072
WAL的块大小: 8192
每一个 WAL 段字节数: 16777216
标识符的最大长度: 64
在索引中可允许使用最大的列数: 32
TOAST区块的最大长度: 1996
大对象区块的大小: 2048
日期/时间 类型存储: 64位整数
正在传递Flloat8类型的参数: 由值
数据页校验和版本: 0
当前身份验证: 6bbb8bf76be8da94e12cd62db6a6149536ed8f1aa76033d2bf52d27d22cc5694
(2)WAL文件
3、检查点作为recovery起始位置的工作原理
三、检查点的触发机制
1、定时触发
由参数checkpoint_timeout设置,缺省300秒(5min);
2、被动触发
pg_xlog(v9.5及以上)& pg_wal(v10及以上)目录下的wal文件总大小超过参数max_wal_size的值,缺省1024MB、64个16MB文件;
pg数据库在smart或fast模式下正常关闭;
3、手动触发
四、检查点的管理及调整
1、检查点调整原则
检查点发生的间隔时间决定了实例恢复需要的时长。
checkpoint timeout设置的值应该根据业务的需求设置,以实例崩溃时,下一次打开数据库时长的容忍度而设置;
(1)间隔时间短,则实例恢复需要的时间就短,可提高数据库的可用性,但是会增加l/O操作,降低数据库状态性能,检査点发生时属于密集型l/O操作,会占用大量系统资源;
(2)间隔时间长,则实例恢复需要的时间就长,会降低数据库的可用性,但是会减少I/O操作,提高数据库状态性能。
2、相关参数
(1)checkpoint_timeout
(2)checkpoint_completion_target:控制每次检查点发生时的I/O吞吐量。
值越高,I/O占用资源越少,数据库性能越好;
值越低,I/O占用资源越多,数据库性能越差,但检查点完成速度越快(值越小,要求检查点写的越快);
常与checkpoint_timeout配合使用。
例如:
计算公式:单次写入数据量/(参数2值*参数1值*60s)*磁盘I/O速度*1024MB
举例:实际数据写入速度=100G/(0.9*5min*60s) *1G*1024 约等于380M/s