PostgreSQLには、PITRするためにWALファイルをアーカイブする機能があります。
しかし、アーカイブされたWALファイルはユーザが削除しない限り、溜まり続けるため、不要になったアーカイブWALは適宜削除する必要があります。
今回はその削除の判断の仕方と削除手順について書きます。
前提条件
- PostgreSQL 9.5.2
- CentOS 7.2
削除対象となるアーカイブWALとは
アーカイブされたWALファイルは、取得していたベースバックと組み合わせたPITRに使用します。
つまり、最も古いベースバックアップよりも古いアーカイブWALは使うことはないため、それらのファイルが削除対象となります。
削除対象となるアーカイブWALの確認方法
とても簡単です。
ベースバックアップ取得時に作成されるbackup_labelのSTART WAL LOCATIONで確認することができます。
以下の例の場合、対象のベースバックアップファイルが必要なWALファイルは「file 000000010000000000000036」とそれ以降のWALファイルということがわかります。つまり、000000010000000000000035、000000010000000000000034~でアーカイブWALは削除対象となります。
$ cat <取得したベースバックアップファイル>/backup_label
START WAL LOCATION: 0/36000028 (file 000000010000000000000036)
CHECKPOINT LOCATION: 0/36000060
BACKUP METHOD: streamed
BACKUP FROM: master
START TIME: 2016-06-26 09:15:44 JST
LABEL: pg_basebackup base backup
※pg_basebackupで取得したベースバックアップの場合、上記のようなbackup_labelが作成されます。
補足1:アーカイブ機能を有効にする設定
そもそもの話として、WALファイルをアーカイブするには以下の設定が必要になります。
wal_level = archive
archive_mode = on
archive_command = '/bin/cp %p /home/kazu/local/pg952/arch/%f'
※PITRするには、wal_levelをarchive、hot_standbyにする必要があります。
※注意
2016年9月にリリースされたPostgreSQL9.6を使用する場合、archiveとhot_standbyが新しい設定値「replica」に統合されました。
補足2:pg_archivecleanupによるアーカイブWALの削除
アーカイブWALを削除するためのコマンドがPostgreSQLでは提供されています。
http://www.postgresql.jp/document/9.5/html/pgarchivecleanup.html
とは言っても、結局は対象のアーカイブWALを指定する必要があるので、手で消すのとそんなに変わらないような気もします。
追記(2020/03/31)
すみません。内容に不備があったので、訂正します。
pg_archivecleanupは引数にバックアップ履歴ファイルを使用することで、対象のバックアップに不要なアーカイブWALを自動で抽出して処理をすることができます。
ですので、手動でやるよりは、このユーティリティツールを使用するほうが安全と言えます。
以下、実行例です。
$ pg_archivecleanup -n ~/local/11/arc 000000010000000000000005.000000D0.backup
/var/lib/pgsql/local/11/arc/000000010000000000000001
/var/lib/pgsql/local/11/arc/000000010000000000000002
/var/lib/pgsql/local/11/arc/000000010000000000000003
/var/lib/pgsql/local/11/arc/000000010000000000000004
-n
はドライランオプションで、削除対象となるアーカイブWALを表示することができます。
第2引数にはアーカイブディレクトリを指定し、第2引数はバックアップ履歴ファイルの名前を指定しています。(このとき、バックアップ履歴ファイルは第1引数のディレクトリ内のものが選択されることに注意してください。)