После того как вы, как ответственный администратор баз данных, создали резервную копию, наступает момент истины: восстановление данных. И тут появляется на сцене главный герой этого эпизода — команда pg_restore. Если pg_dump был вашим супергероем для создания бэкапов, то pg_restore — это его напарник, который воскрешает данные из созданных резервных копий.
pg_restore используется для восстановления данных из файлов, созданных с помощью pg_dump в бинарных форматах (custom или directory). Если по какой-то причине ваша база данных была повреждена, или вы хотите перенести данные на новый сервер, этот инструмент станет вам незаменимым союзником.
Зачем вам нужен pg_restore:
- Он позволяет восстановить как всю базу данных, так и отдельные её компоненты (схему, таблицы, данные).
- Это мощный инструмент для сложных сценариев восстановления, где нужно детально управлять процессом.
Основной синтаксис команды
Работа с pg_restore начинается с базового синтаксиса команды:
pg_restore -U username -d database_name backup_file.dump
Параметры команды:
-U username: указывает имя пользователя PostgreSQL для подключения.-d database_name: имя базы данных, в которую будут восстанавливаться данные.backup_file.dump: файл резервной копии, созданный ранее с помощьюpg_dumpв форматеcustomилиdirectory
Например, если вы хотите восстановить базу данных university из файла backup.dump от имени пользователя postgres, команда будет выглядеть так:
pg_restore -U postgres -d university backup.dump
При запуске этой команды pg_restore начнет процесс восстановления и вернет данные в базу!
Типы бэкапов и их совместимость
Не все резервные копии созданы равными. Возможно, вы помните, что при создании бэкапа с помощью pg_dump мы могли указать разные форматы. Некоторые из них совместимы с pg_restore, а другие нет.
| Формат бэкапа | Описание | Поддерживается pg_restore |
|---|---|---|
plain (текстовый) |
SQL-скрипт, содержащий команды восстановления. | ❌ Нет |
custom |
Сжатый бэкап в проприетарном формате PostgreSQL. | ✅ Да |
directory |
Бэкап, сохраненный в виде директории с несколькими файлами. | ✅ Да |
tar |
Архив в формате TAR. | ✅ Да |
Обратите внимание, что для текстовых бэкапов (plain) вы не можете использовать pg_restore. Такие файлы восстанавливаются вручную с помощью команды psql. Например:
psql -U username -d database_name -f backup.sql
Гибкость pg_restore: параметры восстановления
Одна из главных причин, почему pg_restore так популярен, — это его гибкость. С его помощью можно восстановить не только всю базу данных, но и отдельные части.
Восстановление структуры данных. Если вы хотите восстановить только структуру базы данных (схемы таблиц, индексы, триггеры и т.п.), используйте флаг --schema-only:
pg_restore -U postgres -d university --schema-only backup.dump
Это полезно, если вы хотите проанализировать структуру базы или создать "пустую" копию.
Восстановление только данных. Если вас интересуют только данные (без структуры), используйте параметр --data-only:
pg_restore -U postgres -d university --data-only backup.dump
Такой подход может пригодиться, если структура уже существует, но вам нужно восстановить содержимое таблиц.
Очистка перед восстановлением. Иногда таблицы или схемы уже существуют в базе. Чтобы удалить их перед восстановлением, используйте флаг --clean:
pg_restore -U postgres -d university --clean backup.dump
С этим параметром pg_restore сначала удалит существующие объекты, а затем восстановит данные из бэкапа.
Фильтрация объектов. pg_restore позволяет выбрать, какие именно объекты из резервной копии вы хотите восстановить. Для этого используется флаг --table:
pg_restore -U postgres -d university --table=students backup.dump
Этот пример восстановит только таблицу students.
Вывод SQL в консоль
Если вы хотите посмотреть, что именно будет выполнено во время восстановления, но не хотите сразу изменять базу данных, используйте флаг --list:
pg_restore -l backup.dump
А чтобы получить текстовые SQL-команды, которые будут выполнены, добавьте --verbose:
pg_restore -U postgres --verbose --schema-only backup.dump
Примеры восстановления
- Полное восстановление базы данных.
Самый типичный сценарий: вы хотите полностью восстановить базу данных из бэкапа:
pg_restore -U postgres -d university backup.dump
- Восстановление конкретной таблицы.
Например, если вы потеряли данные только из таблицы courses, восстановите её отдельно:
pg_restore -U postgres -d university --table=courses backup.dump
- Восстановление схемы базы данных.
Чтобы восстановить только структуру таблиц (без данных):
pg_restore -U postgres -d university --schema-only backup.dump
- Восстановление с пересозданием объектов.
Если вам нужно перезаписать существующие данные:
pg_restore -U postgres -d university --clean backup.dump
Типичные ошибки при восстановлении и их предотвращение
Несовместимость версий. Если вы создаете бэкап одной версии PostgreSQL и пытаетесь восстановить его на другую (особенно более старую), вы можете столкнуться с ошибками несовместимости. Решение: старайтесь использовать одинаковые версии PostgreSQL для создания и восстановления бэкапов.
Ошибка "Role does not exist". Если в бэкапе используются роли (пользователи), которых нет на сервере восстановления, вы получите эту ошибку. Решение: заранее создайте нужные роли на новом сервере.
Ошибка "Table already exists". Эта ошибка возникает, если вы пытаетесь восстановить таблицу, которая уже существует. Используйте
--clean, чтобы избежать конфликта.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ