web-dev-qa-db-ja.com

別のスキーマでデータベースを復元したい

次のコマンドを使用して、temp1という名前のデータベースのダンプを取得しました

$  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コマンドを使用してこれを行う方法はありますか?

他の方法も歓迎します!

54
abubacker

Pg_restore自体には方法がありません。できることは、pg_restoreを使用してSQL出力を生成し、それをたとえばsedスクリプトで送信して変更することです。ただし、sedスクリプトを記述する方法に注意する必要があります。したがって、データ内の内容と一致したり変更したりすることはありません。

11
Magnus Hagander

簡単な解決策があります。

  • バックアップダンプをプレーンSQL形式で作成します(パラメーター--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をデフォルトとして設定するため、以前に存在していた「デフォルト」スキーマとは関係なく、このスキーマに新しいテーブルと他のオブジェクトが作成されます。

57
fraber

迅速で汚い方法:

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;
45
shaunc

おそらく最も簡単な方法は、復元後にスキーマの名前を変更することです。つまり、次のSQLを使用します。

ALTER SCHEMA my_schema RENAME TO temp_schema

Pg_dumpの出力に圧縮アーカイブ形式を使用しているため、復元する前にそれを変更することはできません。オプションは、デフォルトの出力を使用し、スキーマ名で検索および置換を行うことですが、これは危険であり、注意しないとデータが破損する可能性があります。

10
Hamish

テーブルが数個しかない場合は、一度に1つのテーブルを復元できます。pg_restoreは、-d databaseを指定したときに-t tablenameを受け入れます。もちろん、テーブルを復元する前にスキーマを設定し、テーブルの復元が完了したらインデックスと制約を整理する必要があります。

または、別のポートに別のサーバーをセットアップし、新しいPostgreSQLサーバーを使用して復元し、スキーマの名前を変更してダンプし、元のデータベースに復元します。もちろん、これは少し面倒ですが、仕事をやり遂げるでしょう。

冒険好きなら、16進エディタを使用してダンプファイルのデータベース名を変更できるかもしれません。ダンプ内の1箇所でしか言及されておらず、新しいデータベース名と古いデータベース名が同じである限り、動作するはずです。 YMMVは、実稼働環境でこのようなことをしないでください。これがあなたの故郷やその他の通常の免責事項を破壊し、平準化しても私を責めないでください。

3
mu is too short

一時データベースのスキーマの名前を変更します。

スキーマをエクスポートします。

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 頂点で。

2
Sico

前述のように、pg_dump、psql、またはpg_restoreでは、ダンプ/復元プロセス中にスキーマ名を変更する直接のサポートはありません。しかし、「プレーン」形式を使用してエクスポートし、.sqlファイルを変更するのはかなり簡単です。このBashスクリプトは基本を実行します。

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
1
Steve Bennett