我们有一个相对较小的Postgres数据库,该数据库具有连续归档功能,可以压缩每个WAL段并将其发送到S3。因为它是一种低容量系统,所以它archive_timeout
每10分钟左右命中一次,并存档大部分未使用的WAL段,该段过去压缩得很好,因为它几乎只是零。
但是,Postgres回收其WAL段,以避免在每个WAL交换机上分配新文件的成本,这在高负载情况下很有用,但是这意味着在发生了比平常多的活动之后,我们的WAL段文件现在已满来自先前片段的垃圾,并且压缩效果不佳。我们正在存储所有这些垃圾的许多副本。
有没有一种方法可以减少我们用来保存WAL存档的空间?一些次优的可能性:
防止Postgres以某种方式回收WAL段,因此每次以零文件开始。该文档没有表明有这样做的选项,但我可能会错过它。
启动/完成使用后,使Postgres将WAL段文件归零。同样,文档似乎并不暗示这是可能的。
在不使用它们时从外部将其清除或删除一些WAL段文件。有没有安全的方法来确定这是哪个文件?
将段的未使用部分归零,然后使用from的输出
pg_xlogdump
将其归档,以查找垃圾从何处开始。可能,尽管我不喜欢它。至少通过在archive命令中执行此操作,可以确保Postgres不会重用该文件。仅通过解释
pg_xlogdump
某种方式的输出来再次归档段文件的使用部分,然后在还原期间将其填充零。虽然我不太喜欢它,但听起来也可能。