15%

Збережіть 15% на всі хостинг-послуги

Перевірте свої навички і отримайте Знижку на будь-який план хостингу

Використовуй код:

Skills
Почати
22.10.2024

Як відновити базу даних MySQL з резервної копії за допомогою MySQL Workbench

Відновлення бази даних MySQL з резервної копії за допомогою MySQL Workbench означає імпорт дамп-файлу .sql (або експорту на основі директорії) у цільову схему через майстер Data Import/Restore графічного інтерфейсу, який внутрішньо виконує клієнтські команди mysql на вашому сервері. Процес займає менше п’яти хвилин для малих і середніх баз даних і вимагає трьох речей: запущеного екземпляра сервера MySQL, дійсного файлу резервної копії та облікового запису користувача з достатніми привілеями (мінімум CREATE, DROP, INSERT, ALTER та INDEX).

Цей посібник охоплює кожен крок від налаштування підключення до перевірки після відновлення, включаючи граничні випадки — невідповідності кодування символів, часткові відновлення, тайм-аути великих файлів та помилки привілеїв — які офіційна документація обходить стороною.

Передумови та контрольний список середовища

Перш ніж відкривати MySQL Workbench, підтвердьте наступне:

  • MySQL Workbench 8.0+ встановлено. Описаний тут макет інтерфейсу відповідає версії 8.0.x. Старіші збірки 6.x мають інший шлях у меню.
  • Формат файлу резервної копії сумісний. Майстер імпорту даних MySQL Workbench приймає файли .sql, створені mysqldump, власним експортом даних MySQL Workbench або будь-яким інструментом, що виводить стандартний SQL DDL/DML. Він НЕ підтримує нативний імпорт .xbstream (Percona XtraBackup) або бінарних файлів .frm/.ibd — вони вимагають окремого процесу фізичного відновлення.
  • Версія цільового сервера MySQL. Відновлення дампу з MySQL 8.0 на сервер MySQL 5.7 завершиться помилкою, якщо дамп використовує синтаксис, специфічний для 8.0 (наприклад, невидимі стовпці, функціональні індекси). Завжди збігайте основні версії або відновлюйте на новішу версію.
  • Привілеї користувача. Виконайте цей запит, щоб перевірити, що ваш обліковий запис має необхідні права:
SHOW GRANTS FOR 'your_user'@'localhost';
  • Налаштування max_allowed_packet. Для великих дампів, що містять стовпці BLOB або довгі оператори INSERT, параметр max_allowed_packet сервера повинен бути достатньо великим. Перевірте та тимчасово збільшіть його за потреби:
SHOW VARIABLES LIKE 'max_allowed_packet';
SET GLOBAL max_allowed_packet = 1073741824; -- 1 GB
  • net_read_timeout та net_write_timeout. Великі відновлення через повільні з’єднання можуть досягати порогів тайм-ауту. Встановіть обидва значення не менше 3600 секунд перед початком.

Якщо ви керуєте віддаленим сервером, переконайтеся, що ваш екземпляр VPS Хостингу має доступний порт MySQL 3306 з вашої робочої станції, або використовуйте SSH-тунель (описано нижче).

Крок 1: Запустіть MySQL Workbench і підключіться до вашого сервера

Відкрийте MySQL Workbench. На головному екрані ви побачите збережені підключення в розділі MySQL Connections.

Підключення до локального сервера: Натисніть на плитку підключення. Введіть пароль, коли буде запропоновано.

Підключення до віддаленого сервера через SSH-тунель: Якщо ваш сервер MySQL знаходиться на віддаленому хості і порт 3306 не є публічно доступним (рекомендована позиція безпеки), використовуйте вбудований SSH-тунель Workbench:

  1. Натисніть значок + поруч із «MySQL Connections».
  2. Встановіть Connection Method на Standard TCP/IP over SSH.
  3. Заповніть ім’я хоста SSH, ім’я користувача SSH та шлях до файлу ключа SSH.
  4. Встановіть ім’я хоста MySQL на 127.0.0.1 і порт на 3306.
  5. Натисніть Test Connection, щоб підтвердити роботу тунелю перед продовженням.

Це правильний підхід для будь-якого виробничого сервера — ніколи не відкривайте MySQL безпосередньо в публічний інтернет.

Крок 2: Підготуйте цільову схему бази даних

Перед імпортом вам потрібна схема призначення. У вас є два шляхи:

Варіант A: Відновлення в існуючу схему

Якщо резервна копія була зроблена зі схеми, яка ще існує на сервері (наприклад, ви відкочуєтеся після невдалої міграції), схема вже видима на панелі Navigator > Schemas зліва. Тут нічого робити не потрібно — ви виберете її під час налаштування імпорту.

Критичне попередження: Імпорт в існуючу схему НЕ видаляє автоматично існуючі таблиці, якщо ваш дамп-файл не містить операторів DROP TABLE IF EXISTS. Якщо ваш дамп був створений з mysqldump --add-drop-table (за замовчуванням), існуючі таблиці будуть видалені та відтворені. Якщо ні, ви можете отримати дублікати даних або порушення обмежень. Перевірте перші 50 рядків вашого файлу .sql:

head -50 /path/to/your_backup.sql

Варіант B: Створення нової схеми

Якщо ви відновлюєте в нову схему (міграція, нове середовище, аварійне відновлення), спочатку створіть її. Перейдіть до File > New Query Tab і виконайте:

CREATE DATABASE `database_name`
  CHARACTER SET utf8mb4
  COLLATE utf8mb4_unicode_ci;

Завжди вказуйте CHARACTER SET utf8mb4 явно. Якщо ви створюєте схему з кодуванням за замовчуванням сервера, а ваш дамп був зроблений з бази даних utf8mb4, ви ризикуєте отримати мовчазне пошкодження кодування символів у рядкових стовпцях. Після виконання натисніть значок оновлення (кругова стрілка) на панелі Schemas, щоб нова схема стала видимою.

Крок 3: Відкрийте майстер імпорту даних

Перейдіть до Server > Data Import у верхній панелі меню. Панель Data Import/Restore відкриється в основному робочому просторі.

Ви побачите два режими імпорту:

Режим імпортуКоли використовувати
Import from Self-Contained FileОдин файл .sql, створений mysqldump або експортом даних Workbench (режим одного файлу). Це найпоширеніший випадок.
Import from Dump Project FolderДиректорія, що містить кілька файлів .sql, організованих за схемою/таблицею, створена експортом даних Workbench у режимі «project folder». Кожна таблиця отримує власний файл.

Для переважної більшості операцій відновлення виберіть Import from Self-Contained File.

Натисніть Browse і перейдіть до вашого файлу резервної копії .sql. Workbench відобразить повний шлях у полі.

Крок 4: Налаштуйте цільову схему та параметри імпорту

Вибір цільової схеми за замовчуванням

У розділі Default Schema to be Imported To відкрийте випадаючий список і виберіть цільову схему, яку ви визначили або створили на кроці 2.

Коли залишати це поле порожнім: Якщо ваш дамп-файл містить власні оператори CREATE DATABASE та USE (поширено, коли mysqldump запускався з прапором --databases або --all-databases), ви можете залишити поле цільової схеми порожнім. Workbench дозволить SQL-скрипту керувати вибором схеми. Однак це означає, що дамп спробує створити базу даних самостійно — якщо вона вже існує, ви можете отримати помилку, якщо дамп не містить CREATE DATABASE IF NOT EXISTS.

Коли необхідно вибрати цільову схему: Якщо дамп був створений з mysqldump database_name > backup.sql (без --databases), файл не містить оператора CREATE DATABASE або USE. Ви ПОВИННІ вибрати цільову схему тут, інакше імпорт завершиться помилкою ERROR 1046: No database selected.

Структура дампу та дані

Якщо ви використовували експорт у форматі project folder Workbench, ви побачите прапорці для вибіркового імпорту:

  • Dump Structure and Data — повне відновлення (за замовчуванням, рекомендовано для аварійного відновлення)
  • Dump Data Only — повторне заповнення таблиць без відтворення схеми; корисно, коли схема вже відповідає
  • Dump Structure Only — відтворення таблиць/представлень/процедур без вставки рядків

Крок 5: Виконайте імпорт

Натисніть Start Import у нижньому правому куті панелі.

Workbench запускає фоновий процес, який передає ваш файл .sql через клієнт командного рядка mysql. Вкладка Import Progress та панель Logs оновлюються в реальному часі. Слідкуйте за:

  • Зелена смуга прогресу досягає 100% — успішне завершення.
  • ERROR 1044 — доступ заборонено; ваш користувач не має привілеїв на цільову схему.
  • ERROR 1005 / ERROR 1215 — помилка обмеження зовнішнього ключа; таблиці створюються в неправильному порядку або відсутня таблиця, на яку є посилання. Це іноді трапляється з частковими дампами.
  • ERROR 2006: MySQL server has gone away — досягнуто порогу max_allowed_packet або тайм-ауту. Збільшіть обидва значення, як показано в розділі «Передумови», і повторіть спробу.
  • Packet too large — та сама першопричина, що й вище.

Для великих баз даних (дампи розміром кілька ГБ) графічний інтерфейс Workbench може здаватися замороженим. Це не так — базовий процес mysql все ще виконується. Не закривайте вікно. Якщо вам потрібен більший контроль над великими відновленнями, підхід через командний рядок є надійнішим:

mysql -u your_user -p --max_allowed_packet=1G database_name < /path/to/backup.sql

Крок 6: Перевірте відновлену базу даних

Повідомлення про успішний імпорт не є достатнім підтвердженням. Завжди виконуйте активну перевірку.

Перевірка на рівні схеми

На панелі Navigator клацніть правою кнопкою миші Schemas і виберіть Refresh All. Розгорніть відновлену базу даних і візуально підтвердьте:

  • Всі очікувані таблиці присутні
  • Представлення, збережені процедури та тригери перелічені у відповідних вузлах

Вибіркова перевірка кількості рядків

Відкрийте нову вкладку запиту, виберіть відновлену базу даних і виконайте:

SELECT
  table_name,
  table_rows,
  ROUND((data_length + index_length) / 1024 / 1024, 2) AS size_mb
FROM information_schema.tables
WHERE table_schema = 'database_name'
ORDER BY table_rows DESC;

Порівняйте ці кількості рядків з вашою вихідною системою або попереднім маніфестом резервної копії. table_rows у information_schema є оцінкою для InnoDB — для точних підрахунків у критичних таблицях виконайте SELECT COUNT(*) FROM table_name безпосередньо.

Перевірка цілісності даних

Для таблиць InnoDB виконайте швидку перевірку узгодженості:

CHECK TABLE your_table_name EXTENDED;

Якщо у вас є зв’язки зовнішніх ключів, перевірте, що референційна цілісність не була порушена під час імпорту:

SET FOREIGN_KEY_CHECKS = 1;
-- Then attempt a JOIN across related tables to confirm linkage
SELECT COUNT(*) FROM orders o JOIN customers c ON o.customer_id = c.id;

Перевірка кодування символів

Якщо ваш застосунок зберігає багатомовний вміст, перевірте, що спеціальні символи не були спотворені:

SELECT column_name FROM table_name WHERE column_name LIKE '%ü%' LIMIT 5;

Якщо результати порожні, хоча не повинні бути, у вас, ймовірно, є невідповідність кодування між дампом і цільовою схемою.

Обробка великих файлів резервних копій та міркування щодо продуктивності

Для баз даних, що перевищують кілька сотень мегабайт, графічний інтерфейс Workbench стає непрактичним. Розгляньте ці підходи:

Розділіть дамп за таблицями: Якщо вам потрібно відновити лише певні таблиці, витягніть їх з дампу:

grep -n "Table structure for table" /path/to/backup.sql

Це показує номери рядків для кожного блоку таблиці, дозволяючи витягти конкретний діапазон за допомогою sed або awk.

Використовуйте mysqlimport для відновлення на основі CSV: Якщо ваша резервна копія у форматі CSV (експортована через SELECT ... INTO OUTFILE), mysqlimport значно швидший, ніж обробка SQL-операторів рядок за рядком.

Вимкніть індекси під час імпорту: Для дуже великих наборів даних тимчасове вимкнення оновлень індексів може скоротити час імпорту на 50–80%:

ALTER TABLE large_table DISABLE KEYS;
-- (import data)
ALTER TABLE large_table ENABLE KEYS;

Зокрема для InnoDB, встановіть innodb_autoinc_lock_mode = 0 та foreign_key_checks = 0 у вашому сеансі перед імпортом:

SET SESSION foreign_key_checks = 0;
SET SESSION unique_checks = 0;

Якщо ви запускаєте MySQL на Виділеному сервері з високою пропускною здатністю I/O, ви також можете тимчасово збільшити innodb_buffer_pool_size, щоб прискорити імпорт, зберігаючи більше даних у пам’яті замість постійного скидання на диск.

Порівняння імпорту даних MySQL Workbench та відновлення через командний рядок

КритерійMySQL Workbench GUI`mysql` CLI / `mysqldump`
Простота використанняВисока — вказати та натиснутиСередня — потребує знайомства з CLI
Обробка великих файлівПогана вище ~500 МБ (GUI зависає)Відмінна — потокова передача напряму
Видимість прогресуПанель журналів, обмежені деталіДетальний вивід з прапором --verbose
Вибіркове відновлення таблицьПідтримується (режим project folder)Потребує ручного редагування файлу або прапора --tables
Автоматизація / скриптуванняНеможливоПовністю скриптується через cron/bash
Підтримка SSH-тунелюВбудованаПотрібне ручне перенаправлення портів SSH
Контроль кодування символівОбмеженийПовний контроль через --default-character-set
Найкраще дляРазові відновлення, середовища розробкиВиробництво, CI/CD, великі бази даних

Поширені помилки та як їх уникнути

Відновлення дампу, що містить клаузули DEFINER: Збережені процедури та представлення часто містять DEFINER='original_user'@'original_host'. Якщо цей користувач не існує на цільовому сервері, імпорт завершиться успішно, але виконання цих об’єктів завершиться помилкою ERROR 1449. Видаліть або замініть клаузули DEFINER перед імпортом:

sed 's/DEFINER=[^ ]* / /g' original_backup.sql > cleaned_backup.sql

Невідповідності часових поясів: Якщо ваш застосунок зберігає значення DATETIME і вихідний та цільовий сервери знаходяться в різних часових поясах, дані відображатимуться зі зсувом. Завжди підтверджуйте, що @@global.time_zone збігається між джерелом і ціллю перед відновленням.

Відновлення в середовище з реплікацією: Якщо цільовий сервер MySQL є первинним сервером реплікації, оператори імпорту будуть записані в бінарний журнал і реплікуватимуться на всі репліки. Зазвичай це бажано для повного відновлення, але може спричинити проблеми, якщо репліки вже випереджають або відстають. Призупиніть реплікацію на репліках перед великою операцією відновлення.

Розростання бінарного журналу: Великі імпорти генерують величезні файли бінарного журналу. Якщо місце на диску обмежене, тимчасово вимкніть бінарне журналювання для сеансу:

SET SQL_LOG_BIN = 0;
-- (perform import)
SET SQL_LOG_BIN = 1;

Примітка: це вимагає привілею SUPER або BINLOG ADMIN і повинно виконуватися лише на автономних серверах, ніколи на первинних серверах реплікації, де репліки залежать від бінарного журналу.

Налаштування автоматичних резервних копій для запобігання майбутній втраті даних

Процедура відновлення настільки хороша, наскільки хороша резервна копія, що її живить. Якщо ви керуєте власним сервером MySQL — чи то на VPS з cPanel, чи то на звичайному Linux VPS — автоматизуйте резервне копіювання за допомогою завдання cron:

# Daily mysqldump backup with timestamp, retained for 7 days
0 2 * * * /usr/bin/mysqldump -u backup_user -p'StrongPassword' 
  --single-transaction 
  --routines 
  --triggers 
  --hex-blob 
  --default-character-set=utf8mb4 
  your_database | gzip > /backups/db_$(date +%F).sql.gz 
  && find /backups -name "db_*.sql.gz" -mtime +7 -delete

Пояснення ключових прапорів:

    --single-transaction — робить узгоджений знімок таблиць InnoDB без їх блокування, що є необхідним для живих баз даних
    --routines — включає збережені процедури та функції (за замовчуванням не включаються)
    --triggers — включає тригери (за замовчуванням включаються, але явне краще)
    --hex-blob — дампує стовпці BLOB як шістнадцяткові рядки, запобігаючи пошкодженню бінарних даних
    
    Зберігайте резервні копії поза сервером. Резервна копія на тому ж диску, що й база даних, яку вона захищає, — це не резервна копія, а хибне відчуття безпеки. Використовуйте віддалене сховище, об’єктне сховище або вторинний сервер. Якщо ваше хостингове середовище підтримує Панелі керування VPS, більшість панелей включають вбудовані функції запланованого резервного копіювання, які можуть автоматично надсилати копії у віддалені місця призначення.
    Технічний контрольний список ключових висновків
    Перед виконанням будь-якого відновлення MySQL пройдіть цю матрицю рішень:
    
    [ ] Підтвердьте, що тип файлу резервної копії — .sql (текстовий дамп), а не бінарний формат XtraBackup
    [ ] Збігайте основні версії сервера MySQL між джерелом і ціллю
    [ ] Перевірте, що користувач має привілеї CREATE, DROP, INSERT, ALTER, INDEX на цільову схему
    [ ] Перевірте max_allowed_packet та змінні тайм-ауту; збільшіть, якщо дамп містить BLOB або є великим
    [ ] Перевірте перші 50 рядків дампу, щоб визначити наявність операторів CREATE DATABASE / USE
  • [ ] Вирішіть: відновлення в існуючу схему (ризик злиття даних) або нову схему (чистий аркуш)
  • [ ] Видаліть клаузули DEFINER, якщо відновлюєте на інший сервер з іншими обліковими записами користувачів
  • [ ] Підтвердьте, що кодування символів збігається між дампом і цільовою схемою (utf8mb4 рекомендується універсально)
  • [ ] Для виробничих відновлень: вимкніть реплікацію, вимкніть бінарне журналювання за потреби, зробіть знімок перед відновленням
  • [ ] Після імпорту: перевірте кількість рядків, виконайте CHECK TABLE, протестуйте підключення застосунку
  • [ ] Для баз даних понад 500 МБ: обійдіть GUI Workbench і використовуйте CLI mysql безпосередньо
  • Поширені запитання

    З: Чи може MySQL Workbench відновити стиснутий файл резервної копії .sql.gz безпосередньо?

    Ні. Майстер імпорту даних MySQL Workbench не приймає файли, стиснуті gzip. Спочатку розпакуйте файл за допомогою gunzip backup.sql.gz або передайте його безпосередньо через CLI: gunzip -c backup.sql.gz | mysql -u user -p database_name.

    З: Чому мій імпорт завершується без помилок, але деякі таблиці відсутні?

    Найпоширенішою причиною є те, що дамп був створений з --no-tablespaces або був частковим експортом, що виключав певні таблиці. Відкрийте файл .sql і знайдіть CREATE TABLE table_name, щоб підтвердити, чи були відсутні таблиці взагалі включені в дамп.

    З: У чому різниця між «Import from Self-Contained File» та «Import from Dump Project Folder» у Workbench?

    Self-contained file — це єдиний монолітний файл .sql, що містить весь DDL та DML для всієї бази даних. Dump project folder — це структура директорій, де схема та дані кожної таблиці зберігаються в окремих файлах — цей формат створюється при використанні експорту даних Workbench з опцією «Export to Dump Project Folder». Формат project folder дозволяє легше виконувати вибіркове відновлення на рівні таблиць.

    З: Моє відновлення завершується помилкою ERROR 1215: Cannot add foreign key constraint. Як це виправити?

    Це трапляється, коли таблиці створюються в порядку, що порушує залежності зовнішніх ключів — таблиця-батько, на яку є посилання, ще не існує, коли створюється дочірня таблиця. Виправлення полягає у вимкненні перевірок зовнішніх ключів для сеансу імпорту. Додайте SET FOREIGN_KEY_CHECKS=0; на початку вашого файлу .sql та SET FOREIGN_KEY_CHECKS=1; в кінці, потім повторно запустіть імпорт.

    З: Чи безпечно відновлювати резервну копію безпосередньо на живу виробничу базу даних без попереднього знімку?

    Ні. Завжди робіть поточну резервну копію живої бази даних перед її перезаписом. Навіть якщо ви впевнені у файлі резервної копії, операція відновлення, що завершується на півдорозі, може залишити схему в частково зміненому стані. Використовуйте mysqldump --single-transaction, щоб зафіксувати поточний стан за лічені секунди без простою, а потім приступайте до відновлення.

    15%

    Збережіть 15% на всі хостинг-послуги

    Перевірте свої навички і отримайте Знижку на будь-який план хостингу

    Використовуй код:

    Skills
    Почати