web-dev-qa-db-ja.com

ロールなしでpostgresデータベースをインポートする

Pg_dumpでエクスポートされたデータベースがありますが、次の方法で再度インポートしようとしています。

psql -d databasename < mydump.sql

存在しない人に役割を付与しようとして失敗します。 (エラーは「ロール「xxx」は存在しません」と言います)

すべてのロールをインポートしてユーザーに自動的に設定する方法はありますか?

37
Braden

インポートのデフォルトの動作では、不明なすべてのロールがインポートの実行中のロールに置き換えられます。そのため、データベースの用途によっては、データベースをインポートしてエラーメッセージを無視しても問題ない場合があります。

http://www.postgresql.org/docs/9.2/static/backup-dump.html#BACKUP-DUMP-RESTORE から引用

SQLダンプを復元する前に、オブジェクトを所有するか、ダンプされたデータベース内のオブジェクトに対する権限を付与されたすべてのユーザーが既に存在している必要があります。そうでない場合、復元は元の所有権や許可を持つオブジェクトの再作成に失敗します。 (時々これはあなたが望むものですが、通常はそうではありません。)

35
oerich

あなたが探しているかもしれない答えは、--no-ownerからpg_restoreコマンド。現時点で受け入れられている回答とは異なり、コマンドは、ダンプ内のロールがデータベースに存在しない場合でも、現在のユーザーですべてのオブジェクトを作成する必要があります。

したがって、pg_restoreによってスキップされる要素はありませんが、インポートされたいくつかの要素が異なるユーザーによって所有されている場合、すべてのレコードは、私が知る限り1人のユーザーのみによって所有されます。

26

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

17
AndreaBoc

はい、pg_dumpallの-gオプションを使用して、ソースDBからすべての「グローバル」オブジェクトをダンプできます。

pg_dumpall -g  > globals.sql

次に、インポートする前に、ターゲットDBに対してglobals.sqlを実行します。

9
Brian.D.Myers