pg_restore error: role XXX does not exist
2023-08-25 11:02:25
質問
あるシステムから別のシステムにデータベースを複製しようとしています。関係するバージョンは 9.5.0 (ソース) と 9.5.2 (ターゲット) です。
ソース 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;
に権限を設定しようとするものです。
pgdba
のみを持つターゲットシステムにはもちろんユーザとして存在しません。
pgdev
のみであり、したがって
pg_restore
.
ソースDB上では、例えば
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
は、そもそもオーナー固有のコマンドをダンプに含めないように注意する必要があるのでは?
どのように解決するのですか?
私は
--no-owner
は
-x
. 私は
-x
をすべての
pg_dump
コマンドに変換する、ということです。
-x, --no-privileges do not dump privileges (grant/revoke)
これは、事実上、問題のある
GRANT
/
REVOKE
コマンドをダンプから取得します。問題は解決されました。
関連
-
[解決済み] psql: FATAL: データベース "<user>" が存在しない
-
[解決済み】PostgreSQLのエラーです。Fatal: ロール "username" が存在しません。
-
[解決済み】psql: FATAL: ロール "postgres" が存在しない
-
[解決済み] なぜORMを使う必要があるのですか?[クローズド]
-
[解決済み] DB2とOracleから見たCLOBとBLOBの違いとは?
-
[解決済み] 外部キーとしてカラムを追加すると、外部キー制約で参照されるカラムが存在しないERRORが表示される
-
[解決済み] Postgresqlサーバーのpostgresという名前のデフォルトのデータベース
-
[解決済み] なぜデータベースは常に円柱で表現されるのですか?[クローズド]
-
[解決済み] SQLiteのテーブルから最後のオートインクリメントされたIDを取り出すには?
-
[解決済み] データベースとフラットファイル
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] なぜORMを使う必要があるのですか?[クローズド]
-
[解決済み] データベースのインデックスはいくつあっても足りない?
-
[解決済み] SQLite UPSERT / UPDATE OR INSERT
-
[解決済み] リレーショナル・データベースにおけるカタログとスキーマの違いは何ですか?
-
[解決済み] SQLITE SQLダンプファイルをPOSTGRESQLに変換する
-
[解決済み] なぜ、いつ、Liquibaseなのか?
-
[解決済み] DynamoDBからアイテム数を取得するには?
-
[解決済み] キーの取り外し方法を教えてください。
-
[解決済み] HiveQLクエリの結果をCSVに出力するにはどうしたらいいですか?
-
[解決済み] CodeIgniter - 1行しか返さないのか?