読者です 読者をやめる 読者になる 読者になる

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 を取得することだけ忘れなければ問題無いだろう。