数据库数据目录下pg_wal的WAL文件在开启归档的模式下会将已归档WAL文件自动清理,具体流程是,转储WAL段文件到disk,写满或者使用pg_switch_wal()后,会生成000000xxxx.ready文件,调用archive_command命令且成功执行后,将ready文件更名为.done文件。而数据库会在执行checkpoint后计算出最旧的需保留的WAL文件,比该值更早的WAL文件均会被清理。
计算该保留的WAL文件通常由wal_keep_segments参数和复制槽位置控制。
在CreateCheckPoint里执行清理部分的代码如下:
/*
* Delete old log files, those no longer needed for last checkpoint to
* prevent the disk holding the xlog from growing full.
*/
//转换当前redo位置为wal文件名
XLByteToSeg(RedoRecPtr, _logSegNo, wal_segment_size);
//计算出当前情况下需保留的最旧wal文件
KeepLogSeg(recptr, &_logSegNo);
_logSegNo--;
//从pg_wal下移除所有比_logSegNo文件号小的WAL文件
RemoveOldXlogFiles(_logSegNo, RedoRecPtr, recptr);
/*
* Retreat *logSegNo to the last segment that we need to retain because of
* either wal_keep_segments or replication slots.
*
* This is calculated by subtracting wal_keep_segments from the