繁体   English   中英

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

[英]Which Postgresql WAL files can I safely remove from the WAL archive folder

现在的情况

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

目录结构如下:

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

D:/WALBACKUP/BASEBACKUP/ 包含初始基础备份的.tar

我的问题是:

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

干杯!

WAL 档案

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

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

pg_xlog

永远不要手动从pg_xlog删除 WAL。 如果你有太多的 WAL 那么:

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

您应该修复导致 WAL 被保留的问题。 如果更改设置后似乎没有发生任何事情,请运行手动CHECKPOINT命令。

如果你有一个离线服务器并且需要删除 WAL 来启动它,你可以在pg_archivecleanup时使用pg_archivecleanup 它知道如何仅删除服务器本身不需要的 WAL……但它可能会破坏基于存档的备份、流式复制等 所以除非你必须,否则不要使用它。

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

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

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

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

我们采用的一个解决方案是每晚执行pg_basebackup 这将创建一个基本备份,稍后我们可以使用pg_archivecleanup使用类似

"%POSTGRES_INSTALLDIR%\bin\pg_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}')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM