75

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

他の方法も大歓迎です!

4

8 に答える 8

66

手早く汚い方法:

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;
于 2013-05-01T02:28:10.380 に答える
15

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

于 2010-11-16T13:47:24.690 に答える
14

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

ALTER SCHEMA my_schema RENAME TO temp_schema

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

于 2010-11-16T06:46:06.413 に答える
4

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

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

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

于 2010-11-16T22:49:58.943 に答える