2016-05-17 5 views
11

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

ответ

10

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

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

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

+1

Есть ли способ восстановить базу данных без опции -x .. в моем случае дамп дается mr кем-то другим, поэтому я не могу его изменить) x option –

+9

'pg_restore --no-privileges --no-owner ... 'позволяет указать, чтобы не включать права собственности или привилегии во время восстановления, были ли эти привилегии и владельцы включены в' pg_dump' – user1448319

 Смежные вопросы

  • Нет связанных вопросов^_^