6

有没有办法按年龄或日期指定文件,而不是通过硬编码名称来使用 pg_archivecleanup 命令清理 WAL 档案?

例如,使用以下命令非常简单:

pg_archivecleanup "C:\Program Files\PostgreSQL\9.2\data\pg_xlog" 000000010000004600000045

其中 000000010000004600000045 是文件名,之前创建的任何文件都将被删除。

但是,如果我想自动化该过程,则必须有一种按年龄/日期选择文件的方法。

4

2 回答 2

10

您可以完美地将其用作独立工具

我看到你使用 Windows,所以我无法帮助你,但这是我在 Unix 上会做的事情。

以下命令将要求清理 3 天之前的最近检查点。您必须设置$ARCHIVEDIR以便它与您的存档日志转储相匹配。

find $ARCHIVEDIR -mtime +3 -name '*backup' -printf '%f\n' | sort -r | head -1 | xargs pg_archivecleanup $ARCHIVEDIR 

一个更完整的脚本是:

#!/bin/bash

ARCHIVEDIR='/var/lib/pg_xlog_archives/whatever/'
CHKPOINT=$(find $ARCHIVEDIR -type f -mtime +3 -name '*backup' -printf '%f\n' | sort -r | head -1)
cd $ARCHIVEDIR
/usr/lib/postgresql/9.3/bin/pg_archivecleanup $ARCHIVEDIR $CHKPOINT

find $ARCHIVEDIR -type f -mtime +3 -a -name '*backup' -a ! -newer $CHKPOINT -delete
于 2014-04-09T14:37:40.980 回答
7

您不应该通过 shell 脚本运行 pg_archivecleanup。该实用程序的目的是在副本读取存档目录时通过 recovery.conf 调用该实用程序。只有实际的副本数据库知道它可以删除哪些文件。

此外,您的 pg_xlog 目录使用 archivecleanup。它用于日志的存档副本,该副本存储在您使用主服务器上的 archive_command 指定的某个位置。

例子:

掌握 postgresql.conf:

archive_command = "scp %f replica:/usr/share/wal_archive:%r"

(注意:我强烈建议使用归档命令调用脚本而不是上面的)

副本recovery.conf:

archive_cleanup_command = 'pg_archivecleanup /usr/share/wal_archive %r'
于 2013-06-05T23:34:36.313 回答