按文件年齡指定清理 - PostgreSQL 9.2
我想
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 ://www.postgresql.org/docs/current/static/pgarchivecleanup.html
你為什麼要用 pg_archivecleanup 做這個?pg_archivecleanup 的要點是它根據備用數據庫的需要選擇要刪除的文件。但這顯然不是你想要做的。
如果你想刪除超過 30 天的文件,只需編寫一個刪除超過 30 天的文件的命令,然後每天從你喜歡的調度程序
find
呼叫它一次。cron
find $ARCHIVEDIR -type f -mtime +30 -delete