![](/img/trans.png)
[英]Is it possible to archive WAL files for one PostgreSQL database within a single instance or must I create a second instance?
[英]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
我的问题是:
干杯!
您可以使用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.