溜まったアーカイブログを削除する

表題とおり、溜まったアーカイブログを削除するスクリプト*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で自動的に削除するときには使えない。