我可以从WAL存档文件夹中安全删除哪些Postgresql WAL文件

我可以从WAL存档文件夹中安全删除哪些Postgresql WAL文件,postgresql,archiving,wal,Postgresql,Archiving,Wal,当前情况 所以我在运行Postgres的数据记录计算机上设置了一个独立的内部硬盘。包含WAL归档文件的硬盘驱动器已满,我想删除所有WAL归档文件,包括初始基本备份,并将其归档到外部备份驱动器 目录结构如下: D:/WALBACKUP/这是所有WAL文件(00000110000.CA00000004等)的父文件夹 D:/WALBACKUP/BASEBACKUP/保存初始基本备份的.tar 我的问题是: 我可以安全地移动除当前WAL存档文件(000000000001.CA0000..等)之外的每个

当前情况

所以我在运行Postgres的数据记录计算机上设置了一个独立的内部硬盘。包含WAL归档文件的硬盘驱动器已满,我想删除所有WAL归档文件,包括初始基本备份,并将其归档到外部备份驱动器

目录结构如下:

D:/WALBACKUP/这是所有WAL文件(00000110000.CA00000004等)的父文件夹

D:/WALBACKUP/BASEBACKUP/保存初始基本备份的.tar

我的问题是:

  • 我可以安全地移动除当前WAL存档文件(000000000001.CA0000..等)之外的每个WAL文件,包括基本备份,并将它们移动到另一个hdd。(请注意,数据库是实时的,正在接收数据)

干杯

WAL文件是增量文件,因此简单的答案是:您不能丢弃任何文件。解决方案是进行新的基本备份,然后删除所有以前的WAL

WAL文件包含修改表的单个语句,因此,如果抛出一些旧的WAL,则恢复过程将失败(不会自动跳过丢失的WAL文件),因为无法可靠地恢复数据库的状态。您可以将WAL文件移动到其他位置,而不会打乱WAL过程,但如果您需要从过去的某个时间点恢复数据库,则必须使所有WAL文件从单个位置再次可用;如果磁盘空间不足,则可能意味着从某个位置恢复,该位置有足够的空间存储基本备份和所有WAL文件。这里的主要问题是,您是否能够在事件发生后以足够快的速度恢复完整的数据库

另一个问题是,如果您无法确定需要更正的问题发生在何处/何时,您唯一的选择是从基本备份开始,然后重播所有WAL文件。这个过程并不困难,但如果您有一个旧的基本备份和许多WAL文件要处理,这只会花费很多时间

通常,对于您的情况,最好的方法是每x个月进行一次新的基本备份,并使用该基本备份收集WAL。在每次新的基本备份之后,您可以删除旧的基本备份及其后续WAL,或者将它们移动到便宜的脱机存储(DVD、磁带等)。如果发生重大事件,您可以从最近的基本备份和此后收集的相对较少的WAL文件中快速将数据库恢复到已知的正确状态。

WAL archives 您可以使用
pg_archivecleanup
命令从给定基本备份不需要的存档(not
pg_xlog
)中删除WAL

一般来说,我建议使用PgBarman或类似的工具来自动化基本备份和WAL保留。它更简单,也不容易出错

pg_xlog
切勿手动从
pg\u xlog
中删除WAL。如果您的WAL太多,则:

  • 您的
    wal\u keep\u segments
    设置使wal保持不变
  • 您启用了
    archive\u模式
    ,并设置了
    archive\u命令
    ,但该命令无法正常工作(请检查日志)
  • 你的
    checkpoint\u segments
    高得离谱,所以你只是产生了太多的WAL;或
  • 您有一个复制插槽(请参见
    pg\u replication\u slots
    视图),它阻止删除WAL
您应该解决导致WAL保留的问题。如果更改设置后似乎什么也没有发生,请运行手动
检查点
命令


如果您有一台离线服务器,并且需要删除WAL才能启动它,那么如果必须,您可以使用
pg_archivecleanup
。它知道如何只删除服务器本身不需要的WAL。。。但它可能会破坏您基于存档的备份、流式复制副本等。因此,除非您必须使用,否则不要使用它。

我们寻求的解决方案是每晚都在执行。这将创建一个基本备份,稍后我们可以使用以下内容在该基本备份之前清理所有“旧”WAL文件

"%POSTGRES_INSTALLDIR%\bin\pg_archivecleanup" -d %WAL_backup_dir% %newestBaseFile%

幸运的是,我们还没有恢复,但它应该在理论上起作用。

< P>如果有人通过搜索如何在复制体系结构下安全地清理WAL目录找到这个问题,那么考虑一下从“代码>离线/代码>复制品中可能遗留下来的情况,在这种情况下,未使用的副本插槽等待副本恢复联机,从而在主数据库上保留大量WAL存档


在我们的例子中,由于硬件故障,一个复制副本出现故障,我们不得不在主数据库上重新创建它以及它的
replica_插槽
,但忘了删除以前使用的一个。一旦我们清除了这些,PSQL就清除了未使用的wal,一切都很好。

当你说你不能扔掉任何文件时,你的意思是“如果你删除了一些wal文件,你将无法恢复数据库”?我打算保留所有wal文件,但将它们存储在.zip中。然后,恢复过程将需要一个更大的RAID阵列来保存所有WAL文件和原始basebackup。这有效吗?虽然postgres只需要上一个wal文件就可以创建下一个wal文件(以增量方式命名/链接的连续文件)。如果我将以前的所有备份文件移动到外部驱动器,归档是否会突然出现故障?请参阅更新的答案。这不仅仅是一个如何收集WAL的问题,尤其是在最短时间内从灾难中恢复的实用性。为更新的信息干杯。这种方法听起来不错!谢谢你的信息。pgbarman看起来是值得考虑在未来过渡到的东西。干杯还有
postgresql.conf
中的
min
/
max\u wal\u size
设置: