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スクリプトを使用してダンプを変更する人がいるのを見てきました。私はその解決策を避けたいのですが、代替手段がない場合はそれを採用します。誰かがダンプのデータベース名を変更するスクリプトを書いて、データが変更されないようにしていますか?
解決策はそれを次のようにダンプすることでした:
pg_dump --no-owner --no-acl blah > blah.psql
次のようにインポートします:
psql blah_devel < blah.psql > /dev/null
私はまだこの警告を受けます:
WARNING: database "blah" does not exist
残りはうまくいくようです。
テキストダンプを作成する場合は、CREATE DATABASE
ビットなしでデータベースをエクスポートできます(つまり、-c
および-C
オプションをpg_dump
に指定しないでください)。これにより、Postgresがデータベースを削除、作成、および接続しようとするのを防ぎます。
アーカイブ形式のいずれかを使用している場合は、-d
オプションをpg_restore
に指定して、復元先のデータベースに名前を付けることができます。
詳細については、pg_dump
とpg_restore
のマニュアルページを確認してください。本番システムでこれを試す前に、 scratch monkey をマウントすることを忘れないでください。重要な詳細。
現在、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