Pg_dumpでエクスポートされたデータベースがありますが、次の方法で再度インポートしようとしています。
psql -d databasename < mydump.sql
存在しない人に役割を付与しようとして失敗します。 (エラーは「ロール「xxx」は存在しません」と言います)
すべてのロールをインポートしてユーザーに自動的に設定する方法はありますか?
インポートのデフォルトの動作では、不明なすべてのロールがインポートの実行中のロールに置き換えられます。そのため、データベースの用途によっては、データベースをインポートしてエラーメッセージを無視しても問題ない場合があります。
http://www.postgresql.org/docs/9.2/static/backup-dump.html#BACKUP-DUMP-RESTORE から引用
SQLダンプを復元する前に、オブジェクトを所有するか、ダンプされたデータベース内のオブジェクトに対する権限を付与されたすべてのユーザーが既に存在している必要があります。そうでない場合、復元は元の所有権や許可を持つオブジェクトの再作成に失敗します。 (時々これはあなたが望むものですが、通常はそうではありません。)
あなたが探しているかもしれない答えは、--no-owner
からpg_restore
コマンド。現時点で受け入れられている回答とは異なり、コマンドは、ダンプ内のロールがデータベースに存在しない場合でも、現在のユーザーですべてのオブジェクトを作成する必要があります。
したがって、pg_restoreによってスキップされる要素はありませんが、インポートされたいくつかの要素が異なるユーザーによって所有されている場合、すべてのレコードは、私が知る限り1人のユーザーのみによって所有されます。
pg_restore
を使用できます--role=rolename
オプションは、復元を実行するために強制的にロール名を使用します。ただし、ダンプは非テキスト形式でなければなりません。
たとえば、次のコマンドでダンプできます。
pg_dump -F c -Z 9 -f my_file.backup my_database_name
そして、あなたはそれを使ってそれを復元することができます:
pg_restore -d my_database_name --role=my_role_name my_file.backup
詳細: http://www.postgresql.org/docs/9.2/static/app-pgrestore.html
はい、pg_dumpallの-gオプションを使用して、ソースDBからすべての「グローバル」オブジェクトをダンプできます。
pg_dumpall -g > globals.sql
次に、インポートする前に、ターゲットDBに対してglobals.sqlを実行します。