別のスキーマでデータベースを復元したい
-
10-10-2019 - |
質問
名前付きのデータベースのダンプを取得しました temp1
, 、follwingコマンドを使用します
$ pg_dump -i -h localhost -U postgres -F c -b -v -f pub.backup temp1
次に、「db_temp」と呼ばれる別のデータベースにダンプを復元したいと思いますが、すべてのテーブルを「temp_schema」(FMS TEMP1データベースにあるデフォルトスキーマではなく)で作成する必要があることを望みます。 「DB_TEMP」データベース。
これを使用する方法はありますか pg_restore
指図?
他の方法も大歓迎です!
解決
pg_restore自体には方法がありません。できることは、PG_RESTOREを使用してSQL出力を生成し、たとえばSEDスクリプトを介してそれを変更して変更することです。ただし、そのSEDスクリプトをどのように記述するかに注意する必要があるため、データ内の物事とは一致せず変更されません。
他のヒント
簡単な解決策があります:
- パラメーターを使用して、プレーンSQL形式でバックアップダンプを作成します(フォーマット「P」
--format=p
また-F p
) - お気に入りの編集者と一緒にpub.backup.sqlダンプを編集し、ファイルの上部に次の2行を追加します。
create schema myschema;
SET search_path TO myschema;
これで、コマンドでバックアップダンプを復元できます
psql -f pub.backup.sql
set search_path to <schema>
コマンドはMySchemaをデフォルトとして設定するため、以前に住んでいた「デフォルト」スキーマとは無関係に、このスキーマに新しいテーブルやその他のオブジェクトが作成されます。
迅速で汚い方法:
1)デフォルトスキーマの名前を変更します。
alter schema public rename to public_save;
2)デフォルトスキーマとして新しいスキーマを作成します。
create schema public;
3)データを復元します
pg_restore -f pub.backup db_temp [and whatever other options]
4)必要に応じてスキーマを変更します。
alter schema public rename to temp_schema;
alter schema public_save rename to public;
おそらく最も簡単な方法は、復元後にスキーマの名前を変更することです。つまり、次のSQLを使用してください。
ALTER SCHEMA my_schema RENAME TO temp_schema
PG_DUMPの出力に圧縮アーカイブ形式を使用しているため、復元する前に変更することはできないと思います。オプションは、デフォルトの出力を使用して検索を行い、スキーマ名を置き換えることですが、それは危険であり、注意しないとデータが破損する可能性があります。
いくつかのテーブルしかない場合は、一度に1つのテーブルを復元できます。 pg_restore
受け入れます -d database
指定するとき -t tablename
. 。もちろん、テーブルを復元する前にスキーマを設定し、テーブルの復元が完了したらインデックスと制約を整理する必要があります。
または、別のポートに別のサーバーを設定し、新しいPostgreSQLサーバーを使用して復元し、スキーマの名前を変更し、ダンプして元のデータベースに復元します。もちろん、これはちょっとしたことですが、仕事を終わらせるでしょう。
冒険好きな場合は、HEXエディターを使用してダンプファイルのデータベース名を変更できる場合があります。ダンプの1つの場所でのみ言及されていると思います。新しいデータベース名と古いデータベース名が同じである限り、機能するはずです。 YMMV、生産環境でこのようなことをしないでください。これが爆発し、あなたの故郷、そして他のすべての通常の免責事項を平準化しても私を責めないでください。
一時的なデータベースのスキーマの名前を変更します。
スキーマのエクスポート:
pg_dump --schema-only --schema=prod > prod.sql
新しいデータベースを作成します。エクスポートを復元します:
psql -f prod.sql
ALTER SCHEMA prod RENAME TO somethingelse;
pg_dump --schema-only --schema=somethingelse > somethingelse.sql
(データベースを削除します)
データの場合、セットを変更するだけです search_path
頂点で。
前述のように、ダンプ/復元プロセス中にスキーマ名を変更するために、PG_DUMP、PSQL、またはPG_RESTOREに直接サポートはありません。ただし、「プレーン」形式を使用してエクスポートし、.sqlファイルを変更するのはかなり簡単です。このバッシュスクリプトは基本を行います:
rename_schema () {
# Change search path so by default everything will go into the specified schema
perl -pi -e "s/SET search_path = $2, pg_catalog/SET search_path = $3, pg_catalog, $2;/" "$1"
# Change 'ALTER FUNCTION foo.' to 'ALTER FUNCTION bar.'
perl -pi -e 's/^([A-Z]+ [A-Z]+) '$2'\./$1 '$3'./' "$1"
# Change the final GRANT ALL ON SCHEMA foo TO PUBLIC
perl -pi -e 's/SCHEMA '$2'/SCHEMA '$3'/' "$1"
}
使用法:
pg_dump --format plain --schema=foo --file dump.sql MYDB
rename_schema dump.sql foo bar
psql -d MYDB -c 'CREATE SCHEMA bar;'
psql -d MYDB -f dumpsql