有没有办法按年龄或日期而不是硬编码名称指定文件来使用pg_archivecleanup命令清理WAL档案?
例如,使用以下命令非常简单:
pg_archivecleanup "C:\Program Files\PostgreSQL\9.2\data\pg_xlog" 000000010000004600000045
其中000000010000004600000045是文件名,之前创建的任何文件都将被删除。
但是,如果我想自动化流程,必须有一种方法按年龄/日期选择文件。
答案 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