2013-06-17 7 views
35

у меня есть базы данных, который был экспортирован с pg_dump, но теперь, когда я пытаюсь импортировать его снова:Импорт Postgres базы данных без ролей

psql -d databasename < mydump.sql 

Он терпит неудачу, пытаясь предоставить роли для людей, которые не существовать. (ошибка говорит «Роль» xxx «не существует»)

Есть ли способ импортировать и установить все роли автоматически для моего пользователя?

ответ

30

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

Цитируя http://www.postgresql.org/docs/9.2/static/backup-dump.html#BACKUP-DUMP-RESTORE

Перед восстановлением SQL-дамп, все пользователи, владеющие объектами или были предоставлены разрешения на объекты в базе данных сбрасывали должны уже существовать. Если они этого не сделают, восстановление не сможет воссоздать объекты с исходным правом собственности и/или разрешениями. (Иногда это то, что вы хотите, но обычно это не так.)

+2

Поскольку я впервые прочитал этот ответ, я пропустил часть, в которой говорилось: «Возможно, все будет хорошо». Чтобы прояснить этот ответ, команда, вероятно, работала при запуске. Отображаемые ошибки не останавливали импорт данных. Роли, которые использовались в источнике, не были в назначении, и любые связанные с ними данные теперь будут связаны с пользователем, выполняющим команду. – shanemgrey

8

Да, вы можете сбросить все «глобальные» объекты из источника БД с опцией -g pg_dumpall в:

pg_dumpall -g > globals.sql 

Затем запустите globals.sql против вашей цели DB перед импортом.

15

С 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

-2

Ну вы можете просто создать новую роль с имя, которое вам не хватает, а затем импортировать дамп без ошибок.

ошибка говорит: «Роль„ххх“не существует» - так это создать :)

22

Ответ, который вы могли бы искать является добавление --no-owner к команде pg_restore. В отличие от принятого ответа на данный момент, команда должна создавать каждый объект с текущим пользователем, даже если роль в дампе не существует в базе данных.

Таким образом, ни один элемент не будет пропущен pg_restore, но если некоторые импортированные элементы принадлежат другим пользователям, все записи теперь будут принадлежать только одному пользователю, насколько я могу судить.

+0

Это сработало отлично, спасибо! –

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