不知道大家有没有关注过,配置文件里archive_cleanup_command参数的注释部分有着这么一句"command to execute at every restartpoint",意思是在每个restartpoint时执行的命令。
提起checkpoint大家可能比较熟悉,对于这个restartpoint,可能有的人就不太了解了。
一个restartpoint相当于恢复期间的检查点,并建立恢复可以前滚而无需重新replay整个恢复日志的点。是在PostgreSQL-8.2提交的。(https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=e002836913ce69ca3e501a6d2c42296f1d103998)
从官方文档来看:
In archive recovery or standby mode, the server periodically performs restartpoints, which are similar to checkpoints in normal operation: the server forces all its state to disk, updates the pg_control file to indicate that the already-processed WAL data need not be scanned again, and then recycles any old WAL segment files in the pg_wal directory.
在存档恢复或备机模式下,服务器定期执行restartpoint,这与正常操作中的checkpoint类似:服务器将其所有状态强制到磁盘,更新pg_control文件以表明已经处理的WAL数据不需要再次扫描,然后回收pg_wal目录中的任何旧的WAL段文件。(https://www.postgresql.org/docs/current/wal-configuration.html)
官方文档里也有如下内容:
If executed during recovery, the CHECKPOINT command will force a restartpoint rather than writing a new checkpoint.
如果在恢复期间执行,CHECKPOINT命令将强制重新启动点,而不是写入新的检查点。(https://www.postgresql.org/docs/current/sql-checkpoint.html)
restartpoint和checkpoint的区别如下
-
checkpoint: 主库用的,用来定期刷脏及其他一些功能,crash后实例自动去找最新的一个 checkpoint ,从其中记录的 redopoint 的 WAL 日志位点开始向后进行redo;
-
restartpoint:存档恢复状态或备机用的,和主库的 checkpoint 功能类似,备库的 checkpointer 进程会定期的做 restartpoint 进行刷脏,并记录一些位点,如果 crash 了直接从对应的位点开始向后进行 redo。
restartpoint 触发机制
1.每经过checkpoint_timeout 的时间,主库做了checkpoint,备库触发restartpoint。
2.备机 WAL 大小快要超过 max_wal_size 参数设定的值。
在归档恢复或待机模式下,服务器定期执行重启点,这类似于正常操作中的检查点:服务器将其所有状态强制到磁盘,更新pg_control文件以指示已处理的WAL数据无需再次扫描,然后回收pg_WAL目录中的任何旧WAL段文件。
重新启动点的执行频率不能高于主检查点,因为重新启动点只能在检查点记录上执行。如果自上次重新启动点以来至少经过了checkpoint_timeout秒,或者WAL大小即将超过max_WAL_size,则当达到检查点记录时,将触发重新启动点。
然而,由于对何时可以执行重新启动点的限制,在恢复过程中,通常会超过max_wal_size,最多超过一个检查点周期的wal。(无论如何,max_wal_size从来都不是一个硬性限制,所以应该始终留出足够的空间以避免磁盘空间不足。)