Після того як ти, як відповідальний адміністратор баз даних, зробив резервну копію, настає момент істини: відновлення даних. І тут на сцену виходить головний герой цього епізоду — команда 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, щоб уникнути конфлікту.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ