Ошибка pg_restore: роль XXX не существует

Попытка репликации базы данных из одной системы в другую. Используемые версии: 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 заботиться о том, чтобы не включать в себя специфические команды владельца на дампе?

Ответ 1

Я понял, что --no-owner не совпадает с -x. Я добавил команды -x ко всем pg_dump, что означает:

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

что фактически исключает нарушающие команды GRANT/REVOKE из дампа. Проблема решена.