あるシステムから別のシステムにデータベースを複製しようとしています。関係するバージョンは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
は、最初にダンプ内に所有者固有のコマンドを含めないでください。
-xオプションなしでデータベースを復元する方法はありますか?私のケースダンプはmrに与えられていますので、私はそれを変更できません)xオプション –
'pg_restore --no-privileges --no-owner ... 'は、 'pg_dump'に権限や所有権が含まれているかどうかにかかわらず、リストア時に所有権や特権を含めないように指定できます。 – user1448319