PostgreSQLバックアップ2題: concurrent pg_restore とpg_rman

無理矢理"concurrent"ネタの流れでpg_rmanの紹介。

concurrent pg_restore

バージョン8.4のpg_restoreから、リストアを並行して行う"-j"オプションが追加された。

百聞は一見にしかず、実際に従来の1プロセスでのリストアと、2プロセスでの並行リストアを行ってみる。

$ pg_dump testdb -F c -f /usr/develop2/testdb.backup 

$ dropdb testdb; createdb  testdb; \
> time pg_restore -d testdb /usr/develop2/testdb.backup 

real    33m3.100s
user    0m26.898s
sys     0m3.292s

$ dropdb testdb; createdb  testdb; \
> time pg_restore -d testdb -j2 /usr/develop2/testdb.backup 
real    21m32.118s
user    0m30.742s
sys     0m3.456s

元データはpgbenchでaccountsテーブルに1億件ほど入っている。従来は33分かかっていたところ、2プロセスでは21分にまで短縮された。


並行処理するアルゴリズムの概略だが、例えば4テーブルA,B,C,Dを2プロセスモードでリストアすると:

  1. プロセス1がテーブルAを、プロセス2がテーブルBを並行してリストア
  2. 次にプロセス1がテーブルCを、プロセス2がテーブルDを並行してリストア
  3. 早く処理が終わったプロセスは余った処理を肩代り

的な動きでリストアが高速化される。


リストアプロセスを多数立ち上げても、DBの書き込みが追い付かないだろうから、せいぜい2か4プロセスでよいと思うが、うれしい機能拡張である。

pg_rman

http://postgresql.g.hatena.ne.jp/pgsql/20091209


バックアップソリューションの大本命 pg_rmanが遂に登場した。
これでやっと面倒なアーカイブログの管理やリカバリ操作から開放されるはずである。


こちらも百聞は一見にしかず、実際に動かしてみる。

インストール
$ tar xvfz pg_rman-1.1.1.tar.gz 
$ cd pg_rman
$ make USE_PGXS=1
$ make USE_PGXS=1 install
設定

すでにPostgreSQLがインストールされているとして:

  1. 環境変数PGDATAにベースディレクトリを設定しておく
  2. postgresql.confのarchive_modeとarchive_commandに値を設定。
  3. 環境変数BACKUP_PATHに、pg_rmanの各種データを保存するディレクトリを設定。とりあえず決め打ちで/home/postgres/pg_rmanなど

ここでは:

export PGDATA=/usr/local/pgsql/data
export BACKUP_PATH=/home/postgres/pg_rman

postgresql.confは:

archive_mode=on
archive_command='cp %p /home/postgres/archivelogs  /%f'

とする。

初期化
$ pg_rman init -B  $BACKUP_PATH

これで、$BACKUP_PATH以下にpg_rman.iniや各種データを保存するディレクトリが作成される。

スナップショット

まずは最初のスナップショットをとる。

$ pg_rman backup --backup-mode=full --with-serverlog

これで終わり。

WALログの保存

データベースをいろいろいじった後、WALログのアーカイブログ領域への保存もコマンド一発。

$ pg_rman backup --backup-mode=archive --with-serverlog

確認。

$ pg_rman validate
INFO: validate: 2009-12-10 09:40:06
リカバリ

リカバリPostgreSQLを止めて、データ領域を削除する。

$ pg_ctl stop
$ rm -rf $PGDATA

ここからリカバリするのだが、これもコマンド一発。

$ pg_rman restore

これで本当に終わり。あとは再起動。

$ pg_ctl start


素晴らしい。

まとめ

素晴らしいツールです。

この他にも溜りすぎたアーカイブログの削除などの管理もできる。もちろんテーブルスペースにも対応しているのでバックアップ取忘れの心配もない。
どんなバックアップが保存されているかの一覧表示機能もある。


  1. ARCLOG_PATHが存在しないとき(postgresql.confのarchive_commandでtypoったとき)、WARNING出してくれるとうれしい。よく間違うので(パッチ作ろうかとおもったけど、init.cの99行目あたりに数行足すだけなので、まあ今はいいや)。
  2. バックアップモードのincremental。和訳で差分になっているがどうなんでしょう。