PostgreSQLのバックアップとリストア

使用しているDB(PostgreSQL 8.4.4)でデータの移行をおこなうことになりました。pg_dumpやpg_restoreを使用することで、データのエクスポートやインポートが可能ということはなんとなく知っているのですが、細かい手順までは理解していないため少し調べてみました。

論理バックアップとリストア

下記ページに記載がありました。
論理バックアップ(pg_dump と pg_dumpall) | Let's Postgres
オススメの形式は、カスタムアーカイブ形式 (-Fc) とのことなので、今回はそれでいこうと思います。プレーンテキスト形式もあるようなので、ストレージに余裕がある場合はこちらでもよい気がします。リストア時にどのコマンドを使うかは、ダンプの形式によって異なるようです。カスタムアーカイブ形式 (-Fc)で出力した場合はpg_restoreでリストア、プレーンテキスト形式(-Fp)で出力した場合はpsqlでリストアのようです。

バックアップ(pg_dump)のオプション指定

カスタムアーカイブ形式を使用することまで決まりましたが、コマンド実行時に他に必要なオプションがないか調べます。オプションに関しては、下記ページで見ることができます。
PostgreSQL 8.4.4文書 pg_dump
"-c"オプションによるクリーンアップのコマンドを含めるようにしてみます。
今回のデータベースでは、ラージオブジェクトは使用していないため"-b"オプションは必要なしと判断します。
テーブル単位でのデータ移行も必要になるため、その場合は"-t"オプションでテーブル名を指定するようにします。"-t"オプションでは、ワイルドカードが使用できるようなのでうまくすれば記述を短くすることも出来そうです。ただし、余計なテーブルまで含めてしまわないように注意は必要ですね。
"-o"オプションは少々気になります。このオプションを付けると、オブジェクト識別子をダンプに含めるようです。既存のテーブルにオブジェクト識別子を使用した外部参照などがないか再確認してみる必要がありそうです。
"--inserts"や"--column-inserts"でインサート文が出力できるため、他のDBへの移行が発生したときに必要になりそうです。

オプションの違いを見てみる

# カスタム形式で出力してみました。
./pg_dump -Fc -t "tbl_*" tmpdb > /tmp/tmpdb1.dmp
# プレーンテキストで出力してみました。ファイルサイズがかなり大きくなりました。
./pg_dump -Fp -t "tbl_*" tmpdb > /tmp/tmpdb2.dmp
# インサート形式で出力してみました。ファイルサイズがさらに大きくなりました。まっ、当然ですね。
./pg_dump -Fp --insert -t "tbl_*" tmpdb > /tmp/tmpdb3.dmp
# --column-insertsにして、--insertとの違いを見てみました。ファイルサイズがさらに大きくなりました。
./pg_dump -Fp -c --column-inserts -t "tbl_*" tmpdb > /tmp/tmpdb4.dmp
# クリーンアップのコマンドを含めるようにしてみました。
./pg_dump -Fp -c --insert -t "tbl_*" tmpdb > /tmp/tmpdb5.dmp
# オブジェクト識別子を出力してみました。結果、使用しているテーブルがなかったため意味はありませんでした。-oと--insertは同時に指定できないようです。
./pg_dump -Fp -c -o -t "tbl_*" tmpdb > /tmp/tmpdb6.dmp

バックアップの実行

オプションをいくつか使ってみて、実際に使用するオプションを決めました。今回は、データを全て上書きしてしまってよいということと、指定したテーブルのみデータ移行するため、それに合わせたオプションにしました。

./pg_dump -Fc -c -t "tbl_*" tmpdb > /tmp/tmpdbYYYYMMDD.dmp

リストア(pg_restore)のオプション指定

バックアップをカスタムアーカイブ形式としたため、リストアではpg_restoreコマンドを使用することになりますが、オプションに何か指定する必要があるかどうか調べます。
オプションに関しては、下記ページで見ることができます。
PostgreSQL 8.4.4文書 pg_restore
"-d"オプションでデータベースを指定します。
pg_restore側にも"-c"オプションは存在するようです。今回はpg_dump側で"-c"オプションを指定しているため必要はないと判断します。逆に、バックアップ側ではクリーンアップのことは気にせずバックアップをおこない、リストア側でクリーンアップが必要な場合のみオプションを指定する、という運用もできそうです。
"-v"オプションは処理経過を見るためにも入れておきます。
"-j"オプションは少々気になります。大量のデータを処理する場合に複数ジョブを並列に実行するため、処理時間の短縮が期待できそうです。
"-t"オプションでは、指定したテーブルのみリストアすることが可能です。この事から、バックアップ側はDBまるごとバックアップを取っておいて、リストア側で取り込むデータを制御する、という運用も可能と考えました。ただし、DBまるごとのバックアップコストを考えるとこれはこれで難しいのかもしれません。
"-l"オプションでアーカイブの内容をリスト表示できます。

リストアの実行

今回は、バックアップ側でデータの制御をおこなっているため、リストア側はシンプルになりました。

./pg_restore -d tmpdb -v /tmp/tmpdb.dmp