checkpoint执行大致分为四步:1)刷写脏页,即将整个share buffer的所有脏页都刷盘;2)生成checkpoint wal记录,并插入WAL BUFFER;3)将checkpoint前的所有wal全部刷盘;4)回收WAL文件。这里主要介绍回收文件时需要注意的一点。尤其是磁盘空间比较紧张的场景下。
本文介绍WAL文件回收时,需要注意的一个点。回收由函数RemoveOldXlogFiles函数完成。这个函数进行回收的时候,跳过时间线进行比较。如果_logSegNo日志号,即当前日志号减去变量控制需要保留的文件数后,得到的日志文件号。比这个日志文件号小的文件都会被删除,即RemoveXlogFile函数的工作。
首先需要判断是否done文件,done文件下才会进入删除。删除前先保存下来删除的文件到共享内存即XLogCtl->lastRemovedSegNo = segno。
如果一直进行promote的话,即使有很多WAL文件,也可能因为日志号在保留的范围内,从而导致不能被删除。这种情况对于不太稳定的环境尤其需要注意。即使及时执行checkpoint,也可能会因为这些WAL文件而撑爆磁盘空间。