PITRによるバックアップ・リカバリ
| Table of Contents |
はじめに
PITRによるオンラインバックアップ・リカバリの参考手順です。
-
前提
- PostgreSQLは8.4を想定しています。
-
PostgreSQLのインストールについては以下を参照して下さい。
PostgreSQL 8.4
PITR設定
postgresql.confの編集
-
pg_xlogディレクトリ配下のWAL(トランザクションログ)をアーカイブログとして保存するよう設定します。
PITRを有効にするにはこの設定が必須です。$ vi /var/lib/pgsql/data/postgresql.conf archive_mode = on # バージョン8.2以降のみ設定する archive_command = 'cp "%p" /var/lib/pgsql/archive/"%f"'
- ・%p
- WAL(トランザクションログ)ファイルのフルパス名
- ・%f
- WAL(トランザクションログ)ファイルのファイル名
-
設定変更を反映させるためPostgreSQLを再起動します。
$ pg_ctl restart
-
最後にアーカイブログ用のディレクトリを作成します。
$ mkdir /var/lib/pgsql/archive
動作確認
バックアップ
チェックポイントの作成
pg_start_backup(),pg_stop_backup()を利用してチェックポイントを作成します。
-
データベース「template1」へ接続します。
$ psql template1
-
pg_start_backup()によりバックアップの開始を宣言します。
template1=# select pg_start_backup(now()::text);
-
データベースクラスタをコピーします。この時、データベースを停止する必要はありません。
template1=# \! cp -rp /var/lib/pgsql/data /var/lib/pgsql/archive/data_bak
-
pg_stop_backup()によりバックアップの終了を宣言します。(履歴ファイルがWAL保管領域に保存されます)
template1=# select pg_stop_backup(); pg_stop_backup---------------- 0/3ED6B4(1 row)
サンプルデータの登録
-
PITRの動作確認用のDBを作成して、データとして現在の時間を登録します。
リカバリ
リカバリ作業
-
Postgresを停止
$ pg_ctl stop
-
データベースディレクトリを退避
$ mv /var/lib/pgsql/data /var/lib/pgsql/data_org
-
ベースバックアップからデータベースディレクトリを復元
$ cp -rp /var/lib/pgsql/archive/base_bak /var/lib/pgsql/data
-
pg_xlogを削除
$ rm -rf /var/lib/pgsql/data/pg_xlog
-
最新のpg_xlogを取得
$ cp -rp /var/lib/pgsql/data_org/pg_xlog /var/lib/pgsql/data/pg_xlog
-
リカバリ用の設定ファイル(サンプル)をコピーします。
$ cp /usr/share/pgsql/recovery.conf.sample /var/lib/pgsql/data/recovery.conf
-
リカバリ用の設定ファイル「/var/lib/pgsql/data/recovery.conf」を編集します。
-
Postgres起動
$ pg_ctl -w start
復旧確認
- testdbへ接続し、recovery_target_timeで指定した時間に戻っている事を確認します。
定期バックアップの設定
シェルスクリプトの作成
-
PITR用のバックアップスクリプトを作成します。
$ vi /var/lib/pgsql/db_backup.sh#!/bin/shSQL="SELECT usename FROM pg_user where usename = 'postgres'"# postgresユーザの存在確認psql -d template1 -c "$SQL" > /dev/null 2>&1if [ $? -ne 0 ]then exitelse rm -rf /var/lib/pgsql/archive_old mv /var/lib/pgsql/archive /var/lib/pgsql/archive_old mkdir /var/lib/pgsql/archive psql -d template1 -c "select pg_start_backup('/var/lib/pgsql/archive/base_bak');" cp -rp /var/lib/pgsql/data /var/lib/pgsql/archive/base_`date +%Y%m%d` psql -d template1 -c "select pg_stop_backup();"fi
-
スクリプトに実行権限を付与します。
$ chmod +x db_backup.sh
cronの設定
-
スクリプトをpostgresユーザのcronに設定します。
# crontab -e0 3 * * 0 /var/lib/pgsql/db_backup.sh