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



现状

因此,我将WAL存档设置为运行Postgres的数据记录计算机上的独立内部硬盘驱动器。包含WAL存档的硬盘驱动器已满,我想删除所有WAL存档文件并将其存档到外部备份驱动器。

目录结构如下:

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

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

那么我的问题是:

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

干杯!

WAL 存档

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

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

pg_xlog

切勿手动从pg_xlog中删除 WAL。如果你有太多的WAL,那么:

  • 你的wal_keep_segments设置是让沃尔留在身边;
  • 您已打开并设置archive_command archive_mode,但它无法正常工作(检查日志(;
  • 你的checkpoint_segments高得离谱,所以你只是产生了太多的WAL;或者
  • 您有一个复制槽(请参阅pg_replication_slots视图(阻止删除 WAL。

您应该解决导致保留 WAL 的问题。如果更改设置后似乎没有任何反应,请运行手动CHECKPOINT命令。

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

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

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

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

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

我们寻求的解决方案是每晚执行pg_basebackup。这将创建一个基本备份,稍后我们可以使用pg_archivecleanup来清理该基础之前的所有"旧"WAL 文件,如下所示

"%POSTGRES_INSTALLDIR%binpg_archivecleanup" -d %WAL_backup_dir% %newestBaseFile%

幸运的是,我们从来没有恢复过,但它在理论上应该可以工作。

如果有人通过搜索如何在复制架构下安全地清理 WAL 目录来发现这一点,请考虑以下情况:offline副本可能有剩余部分,在这种情况下,未使用的副本插槽等待副本重新联机,从而在主数据库上保留大量 WAL 存档。

在我们的例子中,我们遇到了由于硬件故障而导致副本关闭的问题,我们不得不在主数据库上重新创建它及其replica_slot,但忘记摆脱以前使用的副本。一旦我们清除了PSQL就摆脱了未使用的WAL,一切都很好。

You can add the script to automatically clean or remove pg_wal files. This will work in pg-11 version. If you want to use other psql version the you can simply replace the command "/usr/pgsql-11/bin/pg_archivecleanup" to /usr/pgsql-12/bin/pg_archivecleanup or 13 as per your wish. 
#!/bin/bash
/usr/pgsql-11/bin/pg_controldata -D /var/lib/pgsql/11/data/ > pgwalfile.txt

/usr/pgsql-11/bin/pg_archivecleanup -d /var/lib/pgsql/11/data/pg_wal  $(cat pgwalfile.txt | grep "Latest checkpoint's REDO WAL file" | awk '{print $6}')

最新更新