系统中有若干关键的 WAL 运行参数直接影响着数据库的整体吞吐性能与恢复耗时。
检查点(Checkpoints)是事务时间序列中的一个确定同步点。在触发检查点时,后台检查点进程(checkpointer)会将当前共享内存中所有的内存脏数据页全量同步刷写回磁盘数据文件中,并在 WAL 中记录一条特殊的检查点元数据记录。在发生宕机崩溃重启时,恢复引擎只需从最近的检查点记录(REDO 点)开始向后回放日志,因为该点之前的全部历史数据已保证完全落盘。因此在检查点顺利完成后,早于当前检查点之前的陈旧 WAL 段文件便可以被系统安全回收重用或删除。
检查点会在满足以下两个条件之一时自动触发调度: 自上次检查点起耗时达到 checkpoint_timeout 秒(默认 5 分钟),或者产生的 WAL 日志量即将突破 max_wal_size(默认通常为 1GB)。
为了避免在触发检查点时引发剧烈的 I/O 脉冲风暴阻塞业务读写,系统通过 checkpoint_completion_target(默认值为 0.9)将脏页刷盘的 I/O 操作尽可能均匀平摊在整个检查点周期的前 90% 时间区间内,实现极其平滑的后台刷盘。
当旧的 WAL 文件不再被检查点依赖时,系统会在内部对其进行回收重命名以充当未来的新日志段,以此避免频繁向操作系统申请创建和删除大文件的元数据开销。系统保留的日志量下限由参数 min_wal_size 锁定。
在高并发压测场景下,适当调大共享内存中的 WAL 缓冲区参数 wal_buffers,能够有效避免并发事务因等待日志缓冲区排队而导致的抖动。