Пытается реплицировать базу данных из одной системы в другую. Используемые версии: 9.5.0 (источник) и 9.5.2 (цель).Ошибка pg_restore: роль XXX не существует
Источник имя дб foodb
с владельцем pgdba
и целевым именем БД будет называться 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
.
На источнике дб привилегий для примера 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 option –
'pg_restore --no-privileges --no-owner ... 'позволяет указать, чтобы не включать права собственности или привилегии во время восстановления, были ли эти привилегии и владельцы включены в' pg_dump' – user1448319