检查 Postgres WAL 文件中的间隙

检查 Postgres WAL 文件中的间隙

我想编写一个脚本来检查存档的 WAL 文件中是否存在间隙,但我找不到任何编号方案的文档。它看起来相当简单,但我想根据一些官方文档编写脚本,这样我就不会错过任何隐藏的复杂性,例如滚动等。

答案1

从文件系统上做到这一点并不容易。文件名实际上由三部分组成(每部分 8 个字符,十六进制值):时间线、逻辑 XLOG、物理段。为了知道“下一个”文件是什么,您确实需要知道底层数据库发生了什么(新 xlog、新时间线等)。

如果您要归档事务日志,更好的解决方案是让归档命令也将要归档的文件的名称附加到某个列表中——Postgres 会将该名称传递给您的归档脚本,这样您就不必担心自己弄清楚,并且如果该列表中的所有文件都存在,则没有间隙。
(这并不能解决确保没有间隙的问题你实现了这个解决方案,所以你应该按照 Postgres 手册中的 24.3.2 进行基础备份实施此解决方案后...

答案2

源代码之外没有文档。该代码的演练这解释了我所知道的一切,试图解决与您相同的问题。以十六进制向上计数最后两位数字,直到它们达到 FE,然后翻转到 0 并增加中间的第二个日志数字字段。注释理解 WAL 术语在这里也有帮助。

没有记录的原因之一是您可以在编译时更改它;实际上没有人会这样做。另一个问题是,一旦您激活备用系统或执行其他操作来更改时间线 ID,所有顺序保证都将消失。对于大多数人来说,这在实践中也不是问题。如果发生这种情况,您也需要检查监控。

相关内容