#Симптом и границы применимости
Восстановленная через pg_dump база содержит объекты, но роли-владельцы и GRANT отсутствуют: pg_dump сохраняет одну базу, а роли являются глобальными объектами кластера. Для полного переноса ролей используют отдельное сохранение глобальных объектов.
#Как отличить возможные причины
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Роли не входят в дамп базыpg_dump не создаёт роли на целевом сервере. | role ... does not exist при restore | Сохранить globals |
| Роль названа иначеНа новом кластере создан другой пользователь. | Объекты принадлежат неверному владельцу | Сопоставить имена и права |
| Роль уже существуетСкрипт восстановления globals конфликтует с существующим кластером. | role already exists | Ручное согласование |
#Пошаговая диагностика и безопасное исправление
- 1. Убедитесь, что проблема именно в роляхОткройте журнал pg_restore/psql и найдите role does not exist, owner, ACL. Сохраните имена ролей; не запускайте скрипт повторно целиком на рабочем кластере.
- 2. Сравните роли источника и назначенияВ psql на обоих кластерах прочитайте список ролей, не выгружая пароли. Сопоставьте права LOGIN, членство и владельцев данных.
- Мета-команда psql; чтение перечня ролейТекстКомандаМета-команда psql; чтение перечня ролей.
\du
- 3. Сохраните глобальные объекты с исходного кластераОт администратора исходного PostgreSQL выполните pg_dumpall --globals-only в защищённый каталог с ограничением доступа. В дампе могут оказаться чувствительные настройки ролей, включая хеши паролей.Linux · Терминал (Bash)С осторожностьюНужен sudoТерминал хоста источника, привилегированный пользователь БД; globals.sql хранить защищённо и не публиковать.
pg_dumpall --globals-only -f globals.sqlКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
- 4. Просмотрите скрипт перед восстановлениемОткройте globals.sql текстовым редактором и составьте сопоставление старых и новых ролей. Параметры tablespace могут содержать локальные пути, а CREATE ROLE — конфликтовать с существующей ролью.
- 5. Испытайте восстановление в чистом тестовом кластереСначала создайте нужные роли и убедитесь в безопасной совместимости политик паролей, затем восстанавливайте дамп базы. На общем кластере выполнение полного globals.sql без проверки недопустимо.
- 6. Выберите способ сопоставления владельцевЕсли цель — одна сервисная роль, допустим сознательный перенос с pg_restore --no-owner и назначение прав после восстановления; это не замена всех ролей, когда есть RLS, SECURITY DEFINER и разные владельцы.
- 7. Проверьте эффективные разрешения из приложенияСоздайте новое тестовое подключение с ролью приложения; выполните SELECT LIMIT 1 и контрольную запись в отдельную тестовую таблицу. Сверьте владельцев и GRANT, затем документируйте план для рабочего кластера.
#Как проверить, что проблема устранена
В тесте восстановлены ожидаемые роли и членства; подключение приложения работает с минимальными правами, ошибок роли при восстановлении нет.
#Если исправление не помогло
Если исходный кластер утрачен и globals.sql отсутствует, восстановить неизвестные роли автоматически нельзя. Восстановите их имена и минимальные права из документации приложения.