如何使用pg_archivecleanup按文件年龄或日期指定清理

时间:2013-06-05 15:15:10

标签: postgresql wal

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

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

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

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

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

2 个答案:

答案 0 :(得分:6)

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

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

示例:

掌握postgresql.conf:

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

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

replica recovery.conf:

archive_cleanup_command = 'pg_archivecleanup /usr/share/wal_archive %r'

答案 1 :(得分:5)

您可以将其完美地用作standalone tool

我看到你使用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