web-dev-qa-db-ja.com

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

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スクリプトを使用してダンプを変更する人がいるのを見てきました。私はその解決策を避けたいのですが、代替手段がない場合はそれを採用します。誰かがダンプのデータベース名を変更するスクリプトを書いて、データが変更されないようにしていますか?

40
pupeno

解決策はそれを次のようにダンプすることでした:

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

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

psql blah_devel < blah.psql > /dev/null

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

WARNING:  database "blah" does not exist

残りはうまくいくようです。

44
pupeno

テキストダンプを作成する場合は、CREATE DATABASEビットなしでデータベースをエクスポートできます(つまり、-cおよび-Cオプションをpg_dumpに指定しないでください)。これにより、Postgresがデータベースを削除、作成、および接続しようとするのを防ぎます。

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

詳細については、pg_dumppg_restoreのマニュアルページを確認してください。本番システムでこれを試す前に、 scratch monkey をマウントすることを忘れないでください。重要な詳細。

11
voretaq7

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

on source

pg_dump -v -Fc mydb.dmp mydb

on dest

createdb -T template1 mydb2

pg_restore -v -e -d mydb2 mydb.dmp

6
Dmitry Kremer