今回は、クラスタ化していないシングルなPostgreSQLでpg_basebackupを試してみました。
試した環境はCentOS7のPostgreSQL9.2です(pg_basebackupは9.1以降)。
まずはマニュアルを参考に。
https://www.postgresql.jp/document/9.2/html/continuous-archiving.html
バックアップ時のざっくりしたイメージは、こんな感じになるようです。
pg_basebackupを使うと楽なので、こちらを使います。
※実行後は、archive_commandが自動的にWALをバックアップディレクトリにコピーし続けるようなので、
basebackup + WAL backupの二種類のバックアップが必要になります。
今回はバックアップ先に/usr/local/pgsql以下を指定します。
試すだけなのでマウント等は省略。
/usr/local/pgsql/basebackupにベースバックアップを、
/usr/local/pgsql/backupにWALバックアップを取るので、
それぞれ書き込み出来るようにpostgresユーザ権限でディレクトリを作成しておきます。
以下を変更します。
wal_level = hot_standby archive_mode = on archive_command = 'test ! -f /usr/local/pgsql/backup/%f && cp %p /usr/local/pgsql/backup/%f' max_wal_senders = 1
※&&は&&に置き換えて
archive_command = ‘test ! -f /usr/local/pgsql/backup/%f && cp %p /usr/local/pgsql/backup/%f’
にして下さい。
postgresユーザにreplicationの権限を追加します。
今回はローカルで実行するので、peerにします。
local replication postgres peer
特殊な指定、replicationについてはマニュアルに記載が有ります。
https://www.postgresql.jp/document/9.2/html/auth-pg-hba-conf.html
systemctl start postgresql su - postgres pg_basebackup -Ft -z -x -D /usr/local/pgsql/basebackup/
これで/usr/local/pgsql/basebackup/にbase.tar.gzファイルが、/usr/local/pgsql/backup/に最初のWALが書き込まれます。
起動しない時は、pg_log/のログを見ると設定エラーが出ていると思います。
PostgreSQLを停止します。
systemctl stop postgresql
$PGDATAディレクトリを退避させ、basebackupを戻します。
su - postgres cd /var/lib/pgsql mv data/ data.bak/ mkdir data/ tar xzfv /usr/local/pgsql/basebackup/base.tar.gz -C /var/lib/pgsql/data
※今回tar圧縮していますが、pg_basebackupのオプションによって変わるので、それぞれに合った方法でリストアします。
また、他からのアクセスを遮断する必要がある場合はpg_hba.confも一時的に修正が必要になります。
詳細な手順はマニュアルの 24.3.4. 継続的アーカイブによるバックアップを使用した復旧
https://www.postgresql.jp/document/9.2/html/continuous-archiving.html#BACKUP-PITR-RECOVERY
で確認して行います。
postgresユーザ権限で、$PGDATAディレクトリ/var/lib/pgsql/dataにrecovery.confを作成します。
restore_command = 'cp /usr/local/pgsql/backup/%f %p'
ここにrecovery_target_time等を指定する事で、時間指定リカバリも出来るようです。
https://www.postgresql.jp/document/9.2/html/recovery-target-settings.html
起動すればリカバリが実行され、recovery.confはrecovery.doneになります。
systemctl start postgresql
pg_log/にリカバリのログが記録されます。
何らかの原因でWAL側のバックアップリカバリが機能せず起動しない。basebackupだけでも戻したい、
となった場合、basebackupだけではエラーが出て起動しませんので、pg_resetxlogを使います。
WALの分は巻き戻りますが。
pg_resetxlog -f /var/lib/pgsql/data
この場合、起動前にrecovery.confは削除しておきます。