メモ:PostgreSQLのDBを丸ごと移行する方法
何度か失敗して、ようやく解決したのでメモ。次の記事が大変参考になりました。助かりました。
やりたいこと
新しい空っぽのDBに、データの詰まったDBを丸ごと全部移行する。
環境
- Windows Server 2003 Enterprise Edition
- PostgreSQL 8.2.11
背景
アプリケーションサーバとデータベースサーバが共存している稼動中のマシン(以下、移行元マシン)から、データベースサーバだけを別のマシン(以下、移行先マシン)に分離しようとした。
手順
1. 移行先マシンに、PostgreSQLをインストールする。
個々のデータベースは、まだ作成しない。空っぽのまま。
2. 移行元マシンで、DBのダンプファイルを取得する。
- PostgreSQLサービスは開始状態で行う。
- コマンドプロンプトからそのまま実行する。psqlでDBにログインする必要はない。
2-1. 各DBのバックアップを取得する。
pg_dump -h localhost -U ユーザ名 -c DB名 > DB名.dump
2-2. DBのスキーマのバックアップを取得する。
pg_dumpall -h localhost -U ユーザ名 -c -s > 任意名.dump
3. 移行先マシンで、空っぽのDBに対して、2で取得したバックアップファイルをリストアする。
- PostgreSQLサービスは開始状態で行う。
- コマンドプロンプトからそのまま実行する。psqlでDBにログインする必要はない。
(追記)正しくは「ログイン前にコマンドを発行する」ですね。毎回psqlで繋いではいるので。マヌケな記述でした…
3-1. DBのスキーマを適用する。最後の「postgres」は、ダミーのDB名。
psql -h localhost -U ユーザ名 -f 任意名.dump postgres
3-2. 各DBをリストアする。DBの数だけ、次のコマンドを繰り返し実行する。
psql -h localhost -U ユーザ名 -f DB名.dump DB名
ここまでで、基本的には完了。
4. 移行先マシンで、バキュームとアナライズを実行する。
次のコマンドを発行すると、postgres、各DB、template1の各DBに対してバキュームとアナライズが実行される。毎回パスワードを聞かれるので、入力する。
vacuumdb -h localhost -U postgres -a -z
ただし、PostgreSQL8.3以降であれば、バキュームの必要性は下がったといわれるし、後からでもできる。そのため、かならずしもこのタイミングで実行しなければならないわけではないのかも。今回は、8.2系なので実行した。また、アナライズは、作成される実行計画の精度を上げるために必要だと思ったので実行した。
テーブルに対して多数の行を追加/削除した後は、そのテーブルにVACUUM ANALYZEを発行することを推奨します。これによりシステムカタログに最近なされた全ての変更が反映されることになり、PostgreSQLの問い合わせプランナが、問い合わせ計画の作成時により良い選択をできるようになります。
VACCUM : PostgreSQL 8.2.6文書
以上