データベース - postgreSQL - 消せないデータベースの回復 - データベースのコピーを作成
1. 概要 筋書きは、こうである。 別のマシンにデータベースを作成しておく。 現行のマシンのユーザといらないデータベースを除くデータベースの情報をエクスポートする。 別のマシンに現行マシンのユーザと必要なデータベースをインポートする。 別のマシンから、まるまる情報をエクスポートする。 現行マシンを「initdb」する。 現行マシンに別マシンの情報をインポートする。 という寸法なのであります。 2. 環境作成 ターゲットマシンは、「FreeBSD」でありまして、サブのマシンが調子悪いもので、「jail」を利用してデータベースの環境を作成しました。 「jail」に関しては、「仮想化ソフトウェア - FreeBSD - jail」をご参照ください。 データベースの環境作成に関しては、「FreeBSD 13.2 RELEASE - データベース postgreSQL」あたりをご参照ください。 3. バックアップ 元マシンのバックアップを作成します。 ユーザとデータベースに分けて、ここは「postgres」ユーザで。 ユーザのバックアップ。 pg_dumpall --roles-only --clean --if-exists > user.sql ユーザは、これで全ユーザのバックアップがとれます。 データベースのバックアップ。 pg_dump -Fc データベース名 > データベース名.dmp これは、データベース数分実行します。 「template0」と「template1」は更新するものではないので、バックアップはとりません。 大きなデータベースであれば、圧縮も必要でしょうし、時間もものすごくかかるかと思いますが、今回の環境は小さなものだったのですぐに終わりました。 バックアップをとった時点で、データベースが更新されないようにデータベースを停止します。 「root」ユーザ権限で。 service postgresql stop 停止後、前のデータを一応残したまま、データベースのイニシャルまでやっておきます。 mv /var/db/postgres/data96 /var/db/postgres/data96_bak 「data96」は、「postgreSQL」が「9.6」だからですな。 そのうえで。 service postgresql initdb まで、やっておいて。 設定ファイルは、前のものを持ってきて上書きしておきます。 「postgres」ユーザで。 cp /var/db/postgres/data96_bak/pg_hba.conf /var/db/postgres/data96/pg_hba.conf cp /var/db/postgres/data96_bak/postgresql.conf /var/db/postgres/data96/postgresql.conf 4. 一次マシンへリストア 一次マシンへリストアします。 一次マシンは、「initdb」が終わった直後の状態です。 ユーザのリストア。 psql -f user.sql postgres データベースのリストア。 pg_restore --clean --create -d データベース名 データベース名.dmp これももちろん、データベース数分、実行します。 ここ失敗です。データベースは、作成してからでないとうまく動作しませんでした。 なんかコマンドの使い方に問題があるような・・・。 5. 一次マシンからのバックアップ できあがった、一次マシンからバックアップします。 ここでは、「pg_dumpall」でユーザもデータベースもバックアップできるようになっています。 「postgres」ユーザで。 pg_dumpall --column-inserts --username=postgres> pg_dumpall.sql 6. 運用マシンへリストア いよいよ最後の仕上げです。 運用マシンへ一次マシンで出力した「pg_dumpall.sql」を持っていきます。 「root」ユーザ権限で。 service postgresql start 「postgres」ユーザで。 psql --username=postgres --file pg_dumpall.sql postgres これで、うまいこといくはずなんだがな。 一応、「.dmp」のリストアが予定通りでない以外は、いまんとこうまくいっています。
pg_dumpall --roles-only --clean --if-exists > user.sql
pg_dump -Fc データベース名 > データベース名.dmp
service postgresql stop
mv /var/db/postgres/data96 /var/db/postgres/data96_bak
service postgresql initdb
cp /var/db/postgres/data96_bak/pg_hba.conf /var/db/postgres/data96/pg_hba.conf cp /var/db/postgres/data96_bak/postgresql.conf /var/db/postgres/data96/postgresql.conf
psql -f user.sql postgres
pg_restore --clean --create -d データベース名 データベース名.dmp
pg_dumpall --column-inserts --username=postgres> pg_dumpall.sql
service postgresql start
psql --username=postgres --file pg_dumpall.sql postgres