PostgreSQL LinuxWindowsmacOS

Как восстановить резервную копию PostgreSQL при role does not exist

  • Обновлено
  • Чтение ≈ 5 минут

Краткий ответ

При переносе резервной копии PostgreSQL на другой сервер в ней могут быть сведения о владельце таблиц, GRANT/REVOKE и ролях, которых нет на новом кластере. Ошибки role "..." does not exist часто возникают при восстановлении из pg_dump. Сначала выясните формат дампа и назначение роли, затем при допустимой политике восстановления используйте --no-owner/--no-acl для архивного формата либо правильно подготовьте роли; не добавляйте всем пользователям superuser.

В этой статье
  1. Что означает ошибка
  2. Как различить причины
  3. Пошаговая диагностика и устранение
  4. Воспроизведение и проверка только в отдельной тестовой базе
  5. Как убедиться в исправлении и что делать дальше

#Что означает ошибка

При переносе резервной копии 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 не понимает двоичный формат.Определить формат и применять соответствующий инструмент.

#Пошаговая диагностика и устранение

  1. Остановите повторные попытки в рабочую базуВ журнале восстановления сохраните первое сообщение о неизвестной роли и команду, которой запускали восстановление, исключив пароль. Если уже были ошибки при работе без --single-transaction, часть объектов могла создаться. Не запускайте тот же дамп поверх такой базы: сначала выберите новую пустую тестовую базу и проанализируйте побочные изменения.
  2. Определите формат резервной копииВ Linux/macOS откройте терминал, в Windows — «Пуск» → «SQL Shell (psql)» для SQL-команд либо PowerShell для утилит. Проверьте, создан ли файл как pg_dump -Fc/-Fd/-Ft (архив) или как обычный текстовый SQL. Для архива выполните pg_restore --list /path/to/backup.dump — замените путь; ожидается оглавление. Если pg_restore сообщает о текстовом формате, используйте psql, а не эти параметры.
  3. Проверьте совместимость версийВ терминале выполните pg_restore --version для архивов и psql --version для текстового SQL, затем в целевой базе SHOW server_version;. Для переноса на новый сервер выбирайте совместимые инструменты; архив, созданный более новой версией pg_dump, может не читаться старым pg_restore. Если формат не распознан, не меняйте заголовки файла вручную.
  4. Выясните, почему упоминается неизвестная рольДля архива просмотрите вывод pg_restore --list; затем извлеките SQL в отдельный файл командой pg_restore --file=/path/to/review.sql /path/to/backup.dump, заменив оба пути и проверив свободное место. Поиск по тексту ALTER OWNER и GRANT покажет, что требовало прежнюю роль. Для текстового дампа откройте копию .sql в редакторе, не редактируя единственный экземпляр резервной копии.
  5. Выберите политику владельцев и прав заранееЕсли переносите приложение на новый тестовый сервер и старые имена ролей не нужны, согласуйте, кому должны принадлежать восстановленные объекты. В архивном формате --no-owner пропускает восстановление прежних владельцев, --no-acl пропускает GRANT/REVOKE. В результате объекты обычно принадлежат роли, выполняющей восстановление, при условии подходящих прав; после восстановления необходимо назначить минимально нужные права приложению.
  6. Восстановите архив в новую пустую тестовую базуСоздайте через администратора отдельную пустую базу restore_test с нужным владельцем, предварительно проверив, что это не действующая база. Запустите pg_restore --no-owner --no-acl --exit-on-error --single-transaction --dbname=restore_test /path/to/backup.dump, заменив путь и при необходимости реквизиты подключения. --single-transaction обеспечивает откат всего восстановления при поддерживаемых операциях, но не заменяет отдельную тестовую базу и резервную копию.
  7. Для текстового SQL примените отдельный порядокЕсли исходный файл — обычный .sql, параметры pg_restore --no-owner к нему неприменимы. Лучший вариант — при доступности исходной базы заново сформировать экспорт pg_dump --no-owner --no-acl с подходящей версией и восстановить его psql в новой тестовой базе. Если повторный экспорт невозможен, администратор должен тщательно проверить копию скрипта на изменения владельца и GRANT и согласовать безопасную адаптацию; нельзя делать бездумную массовую замену имён.
  8. Проверьте владельцев, объекты и доступ приложенияПосле завершения восстановления убедитесь в отсутствии ошибок, сравните список таблиц и строк на тестовой базе с исходным отчётом, проверьте владельцев и выполнение типовых запросов под отдельной прикладной ролью. При отсутствии прав адресно выдайте их после согласования. Если ошибка повторяется, запишите точный SQL или объект и определите, не требуется ли исходная роль для SECURITY DEFINER, расширения, политики RLS или логики приложения.
  9. Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
    Выберите подходящий вариант — это не команды для последовательного выполнения
    Вариант 1Терминал с установленными клиентскими утилитами PostgreSQL; замените /path/to/backup.dump на свой путь.
    Linux · Терминал (Bash)Команда
    Терминал с установленными клиентскими утилитами PostgreSQL; замените /path/to/backup.dump на свой путь. Это проверка архивного формата, не загрузка данных.
    pg_restore --version
    pg_restore --list /path/to/backup.dump
    Вариант 2Запускать только с разрешением владельца в заранее созданную пустую тестовую БД; замените путь и имя базы н…
    Linux · Терминал (Bash)С осторожностью
    Запускать только с разрешением владельца в заранее созданную пустую тестовую БД; замените путь и имя базы на фактические, проверьте контекст подключения. --no-owner и --no-acl пропускают владельцев и привилегии; --exit-on-error + --single-transaction предотвращают частичную загрузку при ошибке внутри транзакции.
    pg_restore --no-owner --no-acl --exit-on-error --single-transaction --dbname=restore_test /path/to/backup.dump

    Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.

    Вариант 3ТОЛЬКО если есть доступ к исходной базе.
    Linux · Терминал (Bash)С осторожностью
    ТОЛЬКО если есть доступ к исходной базе. Замените путь и имя базы, сохраните оригинальный дамп отдельно; команда читает исходную базу и пишет новый SQL-файл, не восстанавливает его автоматически.
    pg_dump --no-owner --no-acl --format=plain --file=/path/to/new.sql source_db

    Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.

#Воспроизведение и проверка только в отдельной тестовой базе

SQL
Выполнить в восстановленной тестовой базе. Выводит имя базы/роль и первые таблицы с владельцами; сравните с перечнем ожидаемых объектов.
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;

#Как убедиться в исправлении и что делать дальше

Результат: архив восстановлен в согласованную тестовую базу без ошибок неизвестной роли, число объектов и ключевые данные сопоставимы с исходными, прикладная роль имеет ровно необходимые привилегии. При повторной ошибке сохраните формат дампа, версии клиента/сервера, вывод первой ошибки и название объекта — он может содержать ссылки на роли, которые нельзя безопасно пропустить.

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.