PostgreSQLはバージョン8.0からPITR(Point In Time Recovery)機能が
追加されたことにより、メディア障害が発生する直前の状態までデータを
リカバリすることが簡単にできるようになったようです。
手順はそれほど難しくはないようです。
テスト環境:
Redhat系Linux/PostgreSQL : 8.1.10-0vl0.40
シチュエーション:
ある日、突然データベースがぶっとんでしまった(’A`)、ので、
数日前に取っておいた全体バックアップとリアルタイムで更新される
トランザクションログを使用してデータベースを復旧させる。
●まず、PITR機能を利用するための下ごしらえ
rootになってPostgreSQLをストップ
# service postgresql stop
ユーザpostgresにチェンジ
# su – postgres
アーカイブログを保存するディレクトリを作成します。
データの保護を考慮して、物理的に別のディスクに作成するのが
良さそうです。
$ mkdir -p /backup/postgres/archive_dir
トランザクションログも別ディスクに移動しちゃいましょう^^
$ mv /var/lib/pgsql/data/pg_xlog /backup/postgres
$ ln -s /backup/postgres/pg_xlog /var/lib/pgsql/data/pg_xlog
mvコマンドは失敗するとファイルが消失することがあるらしい(’A`)ので
心配性の人はcpコマンドを使えば良いでしょう。
postgresql.confを書き換えます。
$ vi data/postgresql.conf
archive_command = ‘cp %p /backup/postgres/archive_dir/%f’
ルートになってPostgreSQLをスタートさせましょう。
(再起動しないとpostgresql.confの変更が反映されませんです。
# service postgresql start
これで、PITRを利用するための下ごしらえは完了です!!
●データベースの全体バックアップ
まず、pg_start_backupを実行します。
(”)の中の文字列は何でも良いそうです?(ホントカナ
バックアップ時にPostgreSQLを停止する必要はありません。
停止させなくても一貫性のあるバックアップを取得
することが可能です。
ユーザpostgresにチェンジ
# su – postgres
$ psql -c “select pg_start_backup(‘Label’)”
tarコマンドでdataディレクトリを丸ごとバックアップします。
$ tar cjvf /backup/postgres/data.tar.bz2 data
pg_stop_backupを実行します。
$ psql -c “select pg_stop_backup()”
この時点で/backup/postgres/archive_dir/に.backupという
ファイルが作成されているはずです。
これで、無事にバックアップを取ることができました。
ちゃんと、最新の状態までリカバリされることを確認するために、
試しに、データベースに対して挿入とか削除とか
いろいろやってみましょう。
●ある日、突然、データがぶっとんだ!!(’A`)
あわてる必要はありません。
数日前に取っておいた全体バックアップと
最新のトランザクションログがあれば、復旧できます。
まず、rootになってPostgreSQLをストップ
# service postgresql stop
ユーザpostgresにチェンジ
# su – postgres
完全バックアップをPostgreSQLのデータディレクトリに
解凍します。
念のため、現在のdataディレクトリは退避させておきましょう。
$ mv data data.back
(心配な人はこpそいf
完全バックアップファイルを解凍します。
$ tar xjvf /backup/postgres/data.tar.bz2
recovery.confファイルを用意します。
$ cp /usr/share/pgsql/recovery.conf.sample data/recovery.conf
$ vi data/recovery.conf
restore_command = ‘cp /backup/postgres/archive_dir/%f %p’
最後に、rootになってPostgreSQLをスタートさせましょう。
# service postgresql start
おめでとうございます!!
ちゃんと、障害が発生する直前の状態までリカバリできましたよね?
これで無事にリカバリが完了しました!!