2016-05-17 35 views
11

あるシステムから別のシステムにデータベースを複製しようとしています。関係するバージョンは9.5.0(ソース)と9.5.2(ターゲット)です。pg_restoreエラー:ロールXXXが存在しません

ソースdb名がfoodb、オーナーがpgdba、ターゲットdb名がfoodb_dev、所有者がpgdevとなります。

すべてのコマンドは、レプリカをホストするターゲットシステム上で実行されます。

pg_dumpコマンドは次のとおりです。

pg_dump -f schema_backup.dump --no-owner -Fc -U pgdba -h $PROD_DB_HOSTNAME -p $PROD_DB_PORT -d foodb -s --clean; 

これはエラーなしで実行されます。

対応pg_restoreは次のとおりです。スロー

pg_restore --no-owner --if-exists -1 -c -U pgdev -d foodb_dev schema_backup.dump 

エラー:

pg_restore: [archiver (db)] Error while PROCESSING TOC: 
pg_restore: [archiver (db)] Error from TOC entry 3969; 0 0 ACL public pgdba 
pg_restore: [archiver (db)] could not execute query: ERROR: role "pgdba" does not exist 
Command was: REVOKE ALL ON SCHEMA public FROM PUBLIC; 
REVOKE ALL ON SCHEMA public FROM pgdba; 
GRANT ALL ON SCHEMA public TO pgdba; 
GRANT ... 

私はそれのよういくつかのエントリが含まれて参照プレーンテキスト形式(-Fp)でダンプファイルを生成する場合:

REVOKE ALL ON TABLE dump_thread FROM PUBLIC; 
REVOKE ALL ON TABLE dump_thread FROM pgdba; 
GRANT ALL ON TABLE dump_thread TO pgdba; 
GRANT SELECT ON TABLE dump_thread TO readonly; 

ユーザー01の権限を設定しようとしていますもちろん、ユーザpgdevしか持たないターゲットシステム上のユーザとして存在しないので、pg_restoreからのエラーです。 dump_threadテーブルの例えば権限デシベルソースで

# \dp+ dump_thread 
Access privileges 
-[ RECORD 1 ]-----+-------------------- 
Schema   | public 
Name    | dump_thread 
Type    | table 
Access privileges | pgdba=arwdDxt/pgdba+ 
        | readonly=r/pgdba 
Column privileges | 
Policies   | 

迅速な解決策は、単にターゲットクラスタ上でユーザーpgdbaを追加し、それを使って行うことになります。

しかし、--no-ownerは、最初にダンプ内に所有者固有のコマンドを含めないでください。

答えて

10

--no-owner-xと同じではないことを認識しました。

-x, --no-privileges   do not dump privileges (grant/revoke) 

を有効にダンプから問題GRANT/REVOKEコマンドを除外している:私は意味し、すべてのpg_dumpコマンドに-xを追加しました。問題は解決しました。

+1

-xオプションなしでデータベースを復元する方法はありますか?私のケースダンプはmrに与えられていますので、私はそれを変更できません)xオプ​​ション –

+9

'pg_restore --no-privileges --no-owner ... 'は、 'pg_dump'に権限や所有権が含まれているかどうかにかかわらず、リストア時に所有権や特権を含めないように指定できます。 – user1448319

関連する問題