表題とおり、溜まったアーカイブログを削除するスクリプト*1。ここまでやる意味があるかどうかは別として。
commitやabortした時刻はWALログに記録されているので、pg_xlogdumpを使って「X日以前のWALアーカイブを削除する」スクリプトを書いた。
動作はpg_xlogdumpの表示フォーマットに依存しているので、バージョンが変わる毎に動作確認が必要。このスクリプトはver9.3依存。
因みに依存している部分はawkで日時をひろう部分。"$17"とハードコーディングしている。
#!/bin/bash ## NDAYS以前のWALログを削除 NDAYS=3 ## pg_xlogdump PG_XLOGDUMP=/usr/local/pgsql/bin/pg_xlogdump ## アーカイブログを保存するディレクトリ WAL_ARCHIVES=/home/postgres/wal_archives declare -i TARGET_DATE DATE TARGET_DATE=`/bin/date '+%Y%m%d' --date "$NDAYS days ago"` for timeline in $( ls $WAL_ARCHIVES/* | awk -F/ '{print $NF}' | \ cut -c 1-8 | sort | uniq ); do CHECK_MODE="ON" for file in $( ls $WAL_ARCHIVES/${timeline}* | \ grep '[0-9A-F]$'| sort -r ) ; do if [ $CHECK_MODE = "OFF" ]; then rm -f $file else seg=`echo $file | awk -F/ '{print $NF}'` DATE=`$PG_XLOGDUMP -r Transaction -p $WAL_ARCHIVES $seg $seg | \ grep 'commit' |awk '{print $17}' |sed s/-//g | head -1 2>/dev/null` if [ $? -eq 0 -a $DATE -lt $TARGET_DATE ]; then rm -f $file CHECK_MODE="OFF" fi fi done done exit 0
ま、もっと簡単で(ほぼほぼ)合理的なのはfindを使うこれ、と思うけども...
postgres> find /home/postgres/wal_archives -mtime +3 -exec rm -f {} \;
*1:pg_archivecleanupもあるけども、これは明示的にWALセグメントを指定しなければならないので、cronで自動的に削除するときには使えない。