在Postgres中清零WAL段


9

我们有一个相对较小的Postgres数据库,该数据库具有连续归档功能,可以压缩每个WAL段并将其发送到S3。因为它是一种低容量系统,所以它archive_timeout每10分钟左右命中一次,并存档大部分未使用的WAL段,该段过去压缩得很好,因为它几乎只是零。

但是,Postgres回收其WAL段,以避免在每个WAL交换机上分配新文件的成本,这在高负载情况下很有用,但是这意味着在发生了比平常多的活动之后,我们的WAL段文件现在已满来自先前片段的垃圾,并且压缩效果不佳。我们正在存储所有这些垃圾的许多副本。

有没有一种方法可以减少我们用来保存WAL存档的空间?一些次优的可能性:

  1. 防止Postgres以某种方式回收WAL段,因此每次以零文件开始。该文档没有表明有这样做的选项,但我可能会错过它。

  2. 启动/完成使用后,使Postgres将WAL段文件归零。同样,文档似乎并不暗示这是可能的。

  3. 在不使用它们时从外部将其清除或删除一些WAL段文件。有没有安全的方法来确定这是哪个文件?

  4. 将段的未使用部分归零,然后使用from的输出pg_xlogdump将其归档,以查找垃圾从何处开始。可能,尽管我不喜欢它。至少通过在archive命令中执行此操作,可以确保Postgres不会重用该文件。

  5. 仅通过解释pg_xlogdump某种方式的输出来再次归档段文件的使用部分,然后在还原期间将其填充零。虽然我不太喜欢它,但听起来也可能。


有趣的问题。请问您正在使用什么连续归档?
dezso

@dezso尽管用户流失率很低,但尽可能降低丢失任何数据的风险并进行所做更改的审核跟踪被认为非常重要。WAL归档是最后一道防线(也有其他机制在起作用),因此保持便宜就可以了。
Dave Turner

Answers:


5

从9.4版开始,它现在自动将WAL文件的尾部归零。(实际上,它几乎只是零,有一些块头没有被清零,但是结果仍然是非常可压缩的)。

在9.2版中,有一个名为的程序pg_clearxlogtail可以使用。您可以在压缩步骤之前将其添加到archive_command中。

如果您使用的是9.3,那么您就不走运了。

请注意,检查点并不是固有地导致日志文件切换的。可能是archive_timeout导致了切换。


天啊 是的,我们使用的是9.3,因此已经跳过了这两种解决方案之间的裂缝。是的,很抱歉,您是对的,archive_timeout这是导致开关的原因。更正了OP,谢谢。
Dave Turner
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.