PITRによるバックアップ・リカバリ †
はじめに †
- PostgreSQLのインストールについては以下を参照して下さい。
PostgreSQL 8.1
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('/var/lib/pgsql/archive/base_bak'); - データベースクラスタをコピーします。この時、データベースを停止する必要はありません。
template1=# \!cp -rp /var/lib/pgsql/data /var/lib/pgsql/archive/base_bak
- pg_stop_backup()によりバックアップの終了を宣言します。(履歴ファイルがWAL保管領域に保存されます)
template1=# select pg_stop_backup(); pg_stop_backup ---------------- 0/3ED6B4 (1 row)
サンプルデータの登録 †
- PITRの動作確認用のDBを作成して、データとして現在の時間を登録します。
$ createdb testdb $ psql testdb testdb=# CREATE TABLE t_test(time timestamp); testdb=# INSERT INTO t_test VALUES(now()); testdb=# SELECT * from t_test; time ---------------------------- 2009-08-23 04:39:12.9077 2009-08-23 04:39:13.338911 2009-08-23 04:39:13.500074 2009-08-23 04:39:13.60608 2009-08-23 04:39:13.70793 2009-08-23 04:39:13.897418 2009-08-23 04:39:14.095757 2009-08-23 04:39:25.773003 2009-08-23 04:41:03.844767 (9 rows)
リカバリ †
リカバリ作業 †
「2009-08-23 04:40:00」の時点にリカバリします。
- Postgresを停止
$ pg_ctl stop
- データベースディレクトリを退避
$ mv /var/lib/pgsql/data /var/lib/pgsql/data_old
- ベースバックアップからデータベースディレクトリを復元
$ 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_old/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」を編集します。
#実行コマンド restore_command = 'cp /var/lib/pgsql/archive/%f %p' #戻したい時間を指定。無ければ指定しない。 recovery_target_time = '2009-08-23 04:40:00 JST'
- Postgres起動
$ pg_ctl -w start
復旧確認 †
- testdbへ接続し、recovery_target_timeで指定した時間に戻っている事を確認します。
$ psql testdb testdb=# SELECT * from t_test; time ---------------------------- 2009-08-23 04:39:12.9077 2009-08-23 04:39:13.338911 2009-08-23 04:39:13.500074 2009-08-23 04:39:13.60608 2009-08-23 04:39:13.70793 2009-08-23 04:39:13.897418 2009-08-23 04:39:14.095757 2009-08-23 04:39:25.773003 (8 rows)
定期バックアップの設定 †
シェルスクリプトの作成 †
- PITR用のバックアップスクリプトを作成します。
$ vi /var/lib/pgsql/db_backup.sh #!/bin/sh SQL="SELECT usename FROM pg_user where usename = 'postgres'" psql -d template1 -c "$SQL" > /dev/null 2>&1 if [ $? -ne 0 ] then exit else 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 -e 0 3 * * 0 /var/lib/pgsql/db_backup.sh
Last-modified: 2010-09-06 (月) 01:36:11 (8h)