Postgresql

按文件年齡指定清理 - PostgreSQL 9.2

  • August 8, 2016

我想wal_files使用 pg_archivecleanup 保存 30 天。

我遵循了這些腳本:

https://stackoverflow.com/questions/31346606/postgresql-automatic-archive-purge-not-occuring

https://stackoverflow.com/questions/16943599/how-to-specify-cleanup-by-file-age-or-date-with-pg-archivecleanup

#!/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

find $ARCHIVEDIR -type f -mtime +30 -delete

引用自:https://dba.stackexchange.com/questions/145826