Импортировать базу данных postgres без ролей
У меня есть база данных, которая была экспортирована с помощью pg_dump, но теперь, когда я пытаюсь импортировать ее снова с помощью
psql -d databasename < mydump.sql
Он не пытается предоставить роли людям, которые не существуют. (ошибка говорит "Роль" xxx "не существует" )
Есть ли способ импортировать и установить все роли автоматически для моего пользователя?
Ответы
Ответ 1
Поведение импорта по умолчанию заключается в том, что он заменяет все роли, которые он не знает, с ролью, с которой вы выполняете импорт. Поэтому в зависимости от того, для чего вам нужна база данных, вы можете быть в порядке с импортом и игнорированием сообщений об ошибках.
Цитата из http://www.postgresql.org/docs/9.2/static/backup-dump.html#BACKUP-DUMP-RESTORE
Перед восстановлением дампа SQL все пользователи, которые владеют объектами или получили разрешения на объекты в сбрасываемой базе данных, уже должны существовать. Если они этого не сделают, восстановление не сможет воссоздать объекты с исходным правом собственности и/или разрешениями. (Иногда это то, что вы хотите, но обычно это не так.)
Ответ 2
Ответ, который вы, возможно, ищете, добавляет команду --no-owner
в команду pg_restore
. В отличие от принятого ответа на данный момент, команда должна создавать каждый объект с текущим пользователем, даже если роль в дампе не существует в базе данных.
Таким образом, ни один элемент не будет пропущен pg_restore, но если некоторые импортированные элементы принадлежат другим пользователям, все записи теперь будут принадлежать только одному пользователю, насколько я могу судить.
Ответ 3
С помощью pg_restore
вы можете использовать параметр --role=rolename
, чтобы принудительно использовать имя роли для выполнения восстановления. Но дамп должен быть неформатным текстовым форматом.
Например, вы можете сбросить с:
pg_dump -F c -Z 9 -f my_file.backup my_database_name
и вы можете восстановить его с помощью:
pg_restore -d my_database_name --role=my_role_name my_file.backup
для получения дополнительной информации:
http://www.postgresql.org/docs/9.2/static/app-pgrestore.html
Ответ 4
Да, вы можете сбросить все "глобальные" объекты из исходной базы данных с помощью параметра pg_dumpall -g:
pg_dumpall -g > globals.sql
Затем запустите globals.sql против вашей целевой БД перед импортом.
Ответ 5
Ну, вы можете просто создать новую роль с тем же именем, что и вы, а затем импортировать дамп без ошибок.
error говорит: "Роль" xxx "не существует" - создайте его:)