Postgresql检查点
一、 检查点触发机制
在PostgreSQL中,检查点(后台)进程执行检查点;当发生下列情况之一时,其进程将启动:
1、检查点间隔时间由checkpoint_timeout设置(默认间隔为300秒(5分钟))
2、在9.5版或更高版本中,pg_xlog中WAL段文件的总大小(在10版或更高版本中为pg_WAL)已超过参数max_WAL_size的值(默认值为1GB(64个16MB文件))。
3、PostgreSQL服务器在smart或fast模式下关闭。
4、手动checkpoint。
二、检查点作用
所有的数据库几乎都有检查点机制,为什么需要检查点呢,有以下几个作用:
1、定期保存修改过的数据块(保护劳动果实)
检查点发生时,检查点进程会把共享缓冲区中的脏块(被修改过的块)写入磁盘,永久保存,否则如果发生主机断电等故障,内存中的数据块就会丢失,该检查点的发生频率由checkpoint_timeout控制,定期发生。
2、做为实例恢复时起始位置
如果发生实例崩溃,那么下一次启动时则需要进行实例恢复,数据库根据最近一次检查点的位置作为起始位置开始recovery。
3、做为介质恢复时起始位置
每次进行物理备份时都会发生一个检查点,用来判断将来进行恢复时的起始位置,因为备份时数据文件是有先后顺序,备份出来的数据文件是不一致的,将来恢复出来后需要应用归档日志把他们变成同步,开始备份的位置就是将来recovery的位置。
三、检查点记录位置
控制文件中记录了检查点的相关信息
Latest checkpoint location –最新检查点记录的LSN位置。
Prior checkpoint location –先前检查点记录的LSN位置。
四、检查点调整
检查点发生的间隔时间决定了实例恢复需要的时长,checkpoint_timeout设置的值应该根据业务的需求设置,以实例崩溃时,下一次打开数据库时长的容忍度而设置。
间隔时间短,则实例恢复需要的时间就短,可提高数据库的可用性,但是会增加I/O操作,降低数据库状态性能,检查点发生时属于密集型I/O操作,会占用大量系统资源。
间隔时间长,则实例恢复需要的时间就长,会降低数据库的可用性,但是会减少I/O操作,提高数据库状态性能。
五、checkpoint_completion_target
数据库中一个至关重要的参数,主要与参数checkpoint_timeout(checkpoint_timeout)配合使用,值越小意味着检查点要越快完成,要求写得要快。
控制每次检查点发生时i/o的吞吐量,值越高,则i/o占用的资源越少,数据库性能越好;值越低,则i/o占用的资源越多,影响数据库性能,但是提高检查点完成速度。