#Что означает ошибка
При переносе резервной копии PostgreSQL на другой сервер в ней могут быть сведения о владельце таблиц, GRANT/REVOKE и ролях, которых нет на новом кластере. Ошибки role "..." does not exist часто возникают при восстановлении из pg_dump. Сначала выясните формат дампа и назначение роли, затем при допустимой политике восстановления используйте --no-owner/--no-acl для архивного формата либо правильно подготовьте роли; не добавляйте всем пользователям superuser.
#Как различить причины
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| В новом кластере отсутствует владелец объектовДамп содержит попытки ALTER OWNER для имени старой роли. | pg_restore пишет role ... does not exist рядом с установкой владельца. | Восстанавливать без прежнего владельца при согласованном назначении нового; проверить права итоговых объектов. |
| В дампе есть GRANT старой ролиВладельцы создаются, но ACL ссылается на отсутствующих пользователей. | Ошибка у строк GRANT/REVOKE или ACL. | Для тестового восстановления опустить права из дампа через --no-acl, затем назначить нужные права отдельно. |
| Формат не подходит к используемой командеТекстовый .sql пытаются обработать pg_restore либо архив .dump подают в psql. | pg_restore сообщает, что это текстовый дамп, или psql не понимает двоичный формат. | Определить формат и применять соответствующий инструмент. |
#Пошаговая диагностика и устранение
- Остановите повторные попытки в рабочую базуВ журнале восстановления сохраните первое сообщение о неизвестной роли и команду, которой запускали восстановление, исключив пароль. Если уже были ошибки при работе без
--single-transaction, часть объектов могла создаться. Не запускайте тот же дамп поверх такой базы: сначала выберите новую пустую тестовую базу и проанализируйте побочные изменения. - Определите формат резервной копииВ Linux/macOS откройте терминал, в Windows — «Пуск» → «SQL Shell (psql)» для SQL-команд либо PowerShell для утилит. Проверьте, создан ли файл как
pg_dump -Fc/-Fd/-Ft(архив) или как обычный текстовый SQL. Для архива выполнитеpg_restore --list /path/to/backup.dump— замените путь; ожидается оглавление. Если pg_restore сообщает о текстовом формате, используйте psql, а не эти параметры. - Проверьте совместимость версийВ терминале выполните
pg_restore --versionдля архивов иpsql --versionдля текстового SQL, затем в целевой базеSHOW server_version;. Для переноса на новый сервер выбирайте совместимые инструменты; архив, созданный более новой версией pg_dump, может не читаться старым pg_restore. Если формат не распознан, не меняйте заголовки файла вручную. - Выясните, почему упоминается неизвестная рольДля архива просмотрите вывод
pg_restore --list; затем извлеките SQL в отдельный файл командойpg_restore --file=/path/to/review.sql /path/to/backup.dump, заменив оба пути и проверив свободное место. Поиск по тексту ALTER OWNER и GRANT покажет, что требовало прежнюю роль. Для текстового дампа откройте копию .sql в редакторе, не редактируя единственный экземпляр резервной копии. - Выберите политику владельцев и прав заранееЕсли переносите приложение на новый тестовый сервер и старые имена ролей не нужны, согласуйте, кому должны принадлежать восстановленные объекты. В архивном формате
--no-ownerпропускает восстановление прежних владельцев,--no-aclпропускает GRANT/REVOKE. В результате объекты обычно принадлежат роли, выполняющей восстановление, при условии подходящих прав; после восстановления необходимо назначить минимально нужные права приложению. - Восстановите архив в новую пустую тестовую базуСоздайте через администратора отдельную пустую базу
restore_testс нужным владельцем, предварительно проверив, что это не действующая база. Запуститеpg_restore --no-owner --no-acl --exit-on-error --single-transaction --dbname=restore_test /path/to/backup.dump, заменив путь и при необходимости реквизиты подключения. --single-transaction обеспечивает откат всего восстановления при поддерживаемых операциях, но не заменяет отдельную тестовую базу и резервную копию. - Для текстового SQL примените отдельный порядокЕсли исходный файл — обычный .sql, параметры
pg_restore --no-ownerк нему неприменимы. Лучший вариант — при доступности исходной базы заново сформировать экспортpg_dump --no-owner --no-aclс подходящей версией и восстановить его psql в новой тестовой базе. Если повторный экспорт невозможен, администратор должен тщательно проверить копию скрипта на изменения владельца и GRANT и согласовать безопасную адаптацию; нельзя делать бездумную массовую замену имён. - Проверьте владельцев, объекты и доступ приложенияПосле завершения восстановления убедитесь в отсутствии ошибок, сравните список таблиц и строк на тестовой базе с исходным отчётом, проверьте владельцев и выполнение типовых запросов под отдельной прикладной ролью. При отсутствии прав адресно выдайте их после согласования. Если ошибка повторяется, запишите точный SQL или объект и определите, не требуется ли исходная роль для SECURITY DEFINER, расширения, политики RLS или логики приложения.
- Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
#Воспроизведение и проверка только в отдельной тестовой базе
SELECT current_database(), current_user;
SELECT schemaname, tablename, tableowner FROM pg_tables WHERE schemaname NOT IN ('pg_catalog','information_schema') ORDER BY schemaname, tablename LIMIT 25;#Как убедиться в исправлении и что делать дальше
Результат: архив восстановлен в согласованную тестовую базу без ошибок неизвестной роли, число объектов и ключевые данные сопоставимы с исходными, прикладная роль имеет ровно необходимые привилегии. При повторной ошибке сохраните формат дампа, версии клиента/сервера, вывод первой ошибки и название объекта — он может содержать ссылки на роли, которые нельзя безопасно пропустить.