別の名前でPostgreSQLデータベースをエクスポートおよびインポートしますか?


39

PostgreSQLデータベースをエクスポートし、後で別の名前でインポートする方法はありますか?

RailsでPostgreSQLを使用しており、しばしば本番環境からデータをエクスポートします。データベースはblah_productionと呼ばれ、開発時またはステージング時にblah_developmentおよびblah_stagingという名前でインポートします。MySQLの場合、エクスポートにはどこにもデータベースがないため(コメントを除く場合があります)、これは簡単ですが、PostgreSQLでは不可能なようです。不可能ですか?

私は現在、この方法でデータベースをダンプしています:

pg_dump blah > blah.dump

-cまたは-Cオプションを使用していません。そのダンプには次のようなステートメントが含まれます。

COMMENT ON DATABASE blah IS 'blah';

ALTER TABLE public.checks OWNER TO blah;

ALTER TABLE public.users OWNER TO blah;

でインポートしようとすると

psql blah_devel < blah.dump

私は得る

WARNING:  database "blah" does not exist

ERROR:  role "blah" does not exist

たぶん、問題はデータベースではなく、役割でしょうか?

このようにダンプした場合:

pg_dump --format=c blah > blah.dump

そして、この方法でインポートしてみてください:

pg_restore -d blah_devel < tmp/blah.psql

私はこれらのエラーを受け取ります:

pg_restore: WARNING:  database "blah" does not exist
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 1513; 1259 16435 TABLE checks blah
pg_restore: [archiver (db)] could not execute query: ERROR:  role "blah" does not exist
    Command was: ALTER TABLE public.checks OWNER TO blah;
pg_restore: [archiver (db)] Error from TOC entry 1509; 1259 16409 TABLE users blah
pg_restore: [archiver (db)] could not execute query: ERROR:  role "blah" does not exist
    Command was: ALTER TABLE public.users OWNER TO blah;
pg_restore: [archiver (db)] Error from TOC entry 1508; 1259 16407 SEQUENCE users_id_seq blah
pg_restore: [archiver (db)] could not execute query: ERROR:  role "blah" does not exist
    Command was: ALTER TABLE public.users_id_seq OWNER TO blah;
pg_restore: [archiver (db)] Error from TOC entry 1824; 0 0 ACL public postgres
pg_restore: [archiver (db)] could not execute query: ERROR:  role "postgres" does not exist
    Command was: REVOKE ALL ON SCHEMA public FROM postgres;
pg_restore: [archiver (db)] could not execute query: ERROR:  role "postgres" does not exist
    Command was: GRANT ALL ON SCHEMA public TO postgres;
WARNING: errors ignored on restore: 11

何か案は?

私は、sedスクリプトを使用してダンプを変更する人々を見てきました。私はその解決策を避けたいのですが、代替手段がなければそれを採用します。ダンプのデータベース名を変更するスクリプトを作成した人はいますか?

回答:


42

ソリューションは次のようにダンプしていました:

pg_dump --no-owner --no-acl blah > blah.psql

次のようにインポートします:

psql blah_devel < blah.psql > /dev/null

私はまだこの警告を受け取ります:

WARNING:  database "blah" does not exist

しかし、残りは動作するようです。


2
あなたは命の恩人です:)
スリハルシャカッパラ

ライフセーバー仲間:)
あなたは誰が知っています

11

テキスト・ダンプを作成している場合、あなたはせずにデータベースをエクスポートすることができますCREATE DATABASE(つまり、指定していないビット-c-とCオプションにしますpg_dump;)これにより、Postgresがデータベースへのドロップ、作成、接続を試みることを防ぎます。

アーカイブ形式のいずれかを使用している場合は、復元するデータベースに名前を付ける-dオプションを指定できますpg_restore

以下のためのmanページを確認pg_dumpし、pg_restore詳細については、およびマウントすることを忘れないでくださいスクラッチ猿を使用すると、私はいくつかの重要なディテールを残した場合に生産システムでこれを試す前に。


ありがとうございました。-daにpg_restoreを試してみますが、現時点ではテキストとしてダンプし、pg_dumpでは-cも-Cも指定していません。pg_dump databasenameを呼び出しています。何か不足していますか?
プペノ

オプションなしでpg_dump、私は、テキストダンプ&異なるDBに復元をしましたが、何もありません場合ので、(それはしばらくしているあなたは、あなたが接続しているものは何でもデータベースに復元することをダンプを作成する必要がありますCREATE\connectビットSQLテキストダンプに実行されます\iダンプファイルをmportするときにどこにいても
voretaq7

デフォルトでは、テキストまたはバイナリモードのpg_dumpには、データベース名に関する多くの言及があります。
プペノ

6

pg_restoreには-dオプションがあり、データをインポートするためのデータベース名を設定できます。

ソース上

pg_dump -v -Fc mydb.dmp mydb

宛先

createdb -T template1 mydb2

pg_restore -v -e -d mydb2 mydb.dmp


3
この構文は私のために働いた:pg_dump -v -Fc mydb > mydb.dmp(pg_dump v9.4.5)。
パオロ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.