PostgreSQLのバックアップリカバリ (1)
Nagios との連携から始まったのだが、最近PostgreSQLを集中して触っている。その中でバックアップ&リカバリを試してみた。
PostgreSQL のバックアップは、DBの機能を使ったものでは、
1. pg_dump によるDBごとバックアップ
2. WALによるフル・差分バックアップ
がある。 pg_dump はDBごとにまとめてダンプを取る方法で、その分差分バックアップは取れない。 一方2のWALバックアップは、アーカイブログ(変更内容を書き出したファイル)をバックアップすることで、差分バックアップが可能となる。 ただし、インスタンスごとに WALは1つだけらしく、DBごとにバックアップを取る場合には、それぞれをインスタンスとして分割するか、pg_dump で個別に取るかなどの対応が必要になりそうだ。
1のpg_dump は使い方が割合簡単で、例えば、mmmというDBのバックアップを取るには、
$ pg_dump -Fc mmm > /tmp/mmm.dump
などとするだけである。この後、DBを削除し、pg_restore を実施することで、バックアップが復旧できる。
$ dropdb mmm $ pg_restore -C -d postgres /tmp/mmm.dump
2. のWALバックアップは事前に準備が必要となる。まず、postgresql.conf で、下記のような設定を加えておく。
archive_mode = on archive_command = 'test ! -f ./%f && cp %p ./%f' archive_timeout = 10
archive_command が重要で、 上の例だとcpコマンドで PostgreSQLのトップディレクトリ (base, PG_VERSION, etc があるところ, 筆者の場合はUbuntu使用なので、 /var/lib/postgresql/8.3 , 以下topdirとする) に大量にアーカイブログファイルを投げてくれるようになる。 ww
中身は、DBに対する変更内容なので、大事にバックアップしておく必要がある。
この状態で、まずフルバックアップを取るのだが、方法は下記リンクを参照。
http://www.postgresql.jp/document/pg837doc/html/continuous-archiving.html#BACKUP-BASE-BACKUP
psql > select pg_start_backup('label1'); tar czvf ./label1_20090712.tar.gz topdir psql > select pg_stop_backup();
で一通りバックアップが取れて、後は、差分バックアップとして、定期的に
tar czvf ./label1_xlog_yyyymmdd.tar.gz topdir/pg_xlog
を実施する。
リストア方法も同一ページにあり、
1. 最新の pg_xlog の確保
tar czvf ./label1_1_xlog_yyyymmdd.tar.gz topdir/pg_xlog
2. 旧トップディレクトリ削除
rm -rf topdir/
3. フルバックアップデータの戻し
tar xzvf ./label1_20090712.tar.gz
4. pg_xlog ディレクトリのみ削除 (差分バックアップから戻せるため ??)
rm -rf topdir/pg_xlog
5. 差分バックアップから、pg_xlogの戻し
tar xzvf ./label1_xlog_yyyymmdd.tar.gz
6. recovery.conf の作成
restore_command = 'cp ./%f %p'
7. PostgreSQLの起動
/etc/init.d/postgresql-8.3 start
となる。
pg_dump と比べると若干面倒なのだが、基本的にはアーカイブログを正しく配置するだけの作業である。 最初にpg_xlog を取得することだけ忘れなければ問題無いだろう。