Postgresql - резервное копирование базы данных и восстановление от другого владельца?

88

Я сделал резервную копию базы данных на другом сервере, который имеет другую роль, чем мне нужно, с помощью этой команды:

pg_dump -Fc db_name -f db_name.dump

Затем я скопировал резервную копию на другой сервер, где мне нужно восстановить базу данных, но такого владельца, который использовался для этой базы данных, нет. Допустим, у базы данных есть владелец owner1, но на другом сервере у меня только есть, owner2и мне нужно восстановить эту базу данных и сменить владельца.

Что делал на другом сервере при восстановлении:

createdb -p 5433 -T template0 db_name 
pg_restore -p 5433 --role=owner2 -d db_name db_name.dump

Но когда выполняется восстановление, я получаю следующие ошибки:

pg_restore: [archiver (db)] could not execute query: ERROR:  role "owner1" does not exist

Как я могу указать его, чтобы он сменил владельца? Или это невозможно?

Андрюс
источник
1
Помимо того, --no-ownerчто предлагается в принятом ответе, вам также может понадобиться --no-privileges. Смотрите этот ответ
mivk 01

Ответы:

134

Вы должны использовать эту --no-ownerопцию, это перестает pg_restoreпытаться установить право собственности на объекты на первоначального владельца. Вместо этого объекты будут принадлежать пользователю, указанному--role

createdb -p 5433 -T template0 db_name 
pg_restore -p 5433 --no-owner --role=owner2 -d db_name db_name.dump

pg_restore doc

Гэри
источник
14
pg_dump --no-ownerдолжен также сделать это
Ник Барнс
11
Я предпочитаю отложить подобные решения до восстановления. Если вы сделаете это на этапе дампа, значит, вы не сможете передумать, не выполнив экспорт. Выполнение этого при восстановлении означает, что параметры остаются открытыми на тот случай, если вы решите, что вам действительно нужно было создать эту недостающую роль и т. Д.
Гэри
1
Значит, если я хочу сменить владельца, я должен делать резервную копию без владельца? Потому что я думал, что могу сменить владельца при восстановлении. Но даже установив --roleдругого владельца, он все еще пытался использовать первоначального владельца (но тогда я не использовал его --no-owner.
Андрюс
2
@Andrius: Вам не нужно менять резервную копию, ответ Гэри должен решить вашу проблему
Ник Барнс,
5
Просматривая все сообщения по этой теме, они также, кажется, упускают из виду тот факт, что этот подход требует, чтобы новый владелец роли был суперпользователем, по крайней мере, на время восстановления. Тогда все работает
chrismarx