我想wal_files
使用 pg_archivecleanup 保存 30 天。
我遵循了这些脚本:
https://stackoverflow.com/questions/31346606/postgresql-automatic-archive-purge-not-occuring
和
#!/bin/bash
ARCHIVEDIR='/var/lib/pgsql/wal_archive'
CHECKPOINT=$(find $ARCHIVEDIR -type f -mtime +30 -type f -printf '%f\n' | sort -r | head -1)
cd $ARCHIVEDIR
/usr/bin/pg_archivecleanup $ARCHIVEDIR $CHECKPOINT
find $ARCHIVEDIR -type f -mtime +30 -a -type f -a ! -newer $CHECKPOINT -delete
...但这对我不起作用。
我收到此错误:
pg_archivecleanup: invalid filename input
Try "pg_archivecleanup --help" for more information.
find: `-delete': No such file or directory
我的恢复.conf:
archive_cleanup_command = 'pg_archivecleaup_mv.bash -d'
有什么办法可以使这项工作?
更新 1:
我做了一些测试...
恢复.conf:
archive_cleanup_command = 'pg_archivecleaup_mv.bash'
pg_archivecleaup_mv.bash:
declare -r -x PATH='/usr/local/bin:/usr/bin:/bin';
ARCHIVEDIR='/var/lib/pgsql/wal_archive'
CHECKPOINT=$(find $ARCHIVEDIR -type f -mmin +3 -type f -printf '%f\n' | sort -r | head -1)
cd $ARCHIVEDIR
exec "pg_archivecleanup" "$ARCHIVEDIR" "$CHECKPOINT" "%r";
find $ARCHIVEDIR -type f -mmin +3 -a -type f -a ! -newer $CHECKPOINT -delete
-mmin +3
出于测试目的...
通过这样做,错误会发生变化:
pg_archivecleanup: too many parameters
Try "pg_archivecleanup --help" for more information.
archive_cleanup_command "/var/lib/pgsql/bin/pg_archivecleaup_mv.bash": return code 512
更新 2:按照@Sebastian Webber 的想法,我更改了pg_archivecleaup_mv.bash
脚本;我遇到了与使用我编写的脚本相同的问题:
#!/bin/bash -x
ARCHIVEDIR='/var/lib/pgsql/wal_archive'
LAST_BACKUP=$(ls -lto ${ARCHIVEDIR})
FILE_LIST=$(/usr/pgsql-9.2/bin/pg_archivecleanup -n "${ARCHIVEDIR}" "${LAST_BACKUP}")
## TEST FIRST
/usr/pgsql-9.2/bin/pg_archivecleanup -n "${ARCHIVEDIR}" "${LAST_BACKUP}" | find -type f -mmin +30 | xargs ls -lh
##THEN UNCOMMENT THIS LINE
#/usr/pgsql-9.2/bin/pg_archivecleanup -n "${ARCHIVEDIR}" "${LAST_BACKUP}" | find -type f -mmin +30 -delete
恢复.conf:
archive_cleanup_command = 'exec /var/lib/pgsql/bin/pg_archivecleaup_mv.bash -d "%r"'
有或没有
"%r"
我得到错误:pg_archivecleanup: invalid filename input
没有
"%r"
,我将 %r 放入脚本中:/usr/pgsql-9.2/bin/pg_archivecleanup -n "${ARCHIVEDIR}" "${LAST_BACKUP}" "%r"| find -type f -mmin +30 | xargs ls -lh
- 然后我收到错误:pg_archivecleanup: too many parameters
首先,如果您需要保留存档
WAL
文件,最好将其放在另一个目录中。如果您使用存档文件来恢复备用服务器,我可能更愿意为它制作一个单独的副本。您可以使用参数在主服务器中调整它
archive_command
。现在,如果您只想保留一个目录用于相同目的,请记住
pg_archivecleanup
需要存档的 wal 位置(似乎可以使用变量$ARCHIVEDIR
)和最后一个备份文件(witch 包含用于备份的第一个和最后一个存档 wal 文件,它包含一个.backup 扩展名,例如:)000000010000003700000010.00000020.backup
并且它丢失了。要解决您的脚本,请
.backup
在目录中找到最新文件$ARCHIVEDIR
并调用选项pg_archivecleanup
以-n
获取要删除的 wal 文件列表,然后使用该列表查找超过 30 天的文件。我的想法是这样的:
https://gist.github.com/sebastianwebber/855585ef3ef6a50c50cca7b57bc8d7d3#file-pg_cleanup_oldmorethan_30days-sh
请查看文档以获取更多详细信息: https ://www.postgresql.org/docs/current/static/pgarchivecleanup.html
你为什么要用 pg_archivecleanup 做这个?pg_archivecleanup 的要点是它根据备用数据库的需要选择要删除的文件。但这显然不是你想要做的。
如果你想删除超过 30 天的文件,只需编写一个删除超过 30 天的文件的命令,然后每天从你喜欢的调度程序
find
调用一次。cron
这已经解决了。
恢复.conf:
最终的 pg_archivecleanup 脚本:
脚本工作正常。但是,我收到一个错误:
/usr/pgsql-9.2/bin/pg_archivecleanup: invalid option -- 'r'
无论如何,我会尝试找到该问题,然后编辑此答案。但它正在工作。