無理矢理"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がテーブルAを、プロセス2がテーブルBを並行してリストア
- 次にプロセス1がテーブルCを、プロセス2がテーブルDを並行してリストア
- 早く処理が終わったプロセスは余った処理を肩代り
的な動きでリストアが高速化される。
リストアプロセスを多数立ち上げても、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がインストールされているとして:
- 環境変数PGDATAにベースディレクトリを設定しておく
- postgresql.confのarchive_modeとarchive_commandに値を設定。
- 環境変数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 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
素晴らしい。
まとめ
素晴らしいツールです。
この他にも溜りすぎたアーカイブログの削除などの管理もできる。もちろんテーブルスペースにも対応しているのでバックアップ取忘れの心配もない。
どんなバックアップが保存されているかの一覧表示機能もある。
- ARCLOG_PATHが存在しないとき(postgresql.confのarchive_commandでtypoったとき)、WARNING出してくれるとうれしい。よく間違うので(パッチ作ろうかとおもったけど、init.cの99行目あたりに数行足すだけなので、まあ今はいいや)。
- バックアップモードのincremental。和訳で差分になっているがどうなんでしょう。