*Cube-Host — повний спектр хмарних послуг!!

Міграція бази даних MySQL: покроковий та безпечний метод

MySQL database migration: a step-by-step and secure method

Міграція бази даних MySQL — це операція, що має значний вплив: вона впливає на цілісність даних, час безвідмовної роботи додатків та безпеку відкату. У цьому посібнику описано перевірений алгоритм міграції з використанням mysqldump (найбільш універсальний варіант) та пояснено, як скоротити час простою за допомогою «остаточної синхронізації» або реплікації.

MySQL найчастіше розміщується на VPS під управлінням Linux, але міграція може стосуватися й додатків на VPS під управлінням Windows. У будь-якому разі стабільна продуктивність мережі та диска від вашого провайдера VPS-хостингу робить міграцію швидшою та безпечнішою.

Коли міграція є необхідною

  • Перехід на новий сервер/до нового провайдера.
  • Оновлення версії MySQL/MariaDB (або зміна дистрибутива).
  • Відокремлення бази даних від сервера додатків для підвищення продуктивності.
  • Підготовка до реплікації, відмовостійкості або масштабування читання.
  • Міграція сховища (HDD → SSD/NVMe, зміна розміру томів).

Ризики та способи їх мінімізації

  • Відмінності версій: зміни sql_mode, плагін автентифікації за замовчуванням та налаштування сортування за замовчуванням можуть призвести до збою додатків після міграції.
  • Невідповідність кодування/сортування: сортування utf8mb4 відрізняється між версіями (особливо між MySQL 5.7 та 8.0).
  • Неперенесені привілеї/користувачі: користувачі не входять до складу дампа однієї бази даних, якщо ви не перенесете їх спеціально.
  • Непослідовний дамп: дамп, зроблений під час інтенсивного запису, може стати логічно непослідовним, якщо не використовувати правильні параметри.
  • Час простою: якщо ви переходите без остаточного плану синхронізації, ви ризикуєте втратою даних або тривалими періодами технічного обслуговування.

Перелік дій перед міграцією (зробіть це спочатку)

  • Перевірте версії джерела та призначення: MySQL проти MariaDB, основні/додаткові версії.
  • Запишіть налаштування сервера: sql_mode, lower_case_table_names, часовий пояс та налаштування innodb.
  • Перевірте, який механізм зберігання даних використовується (InnoDB чи MyISAM).
  • Оцініть обсяг даних та очікуваний час вивантаження (важливий ввід-вивід на диск).
  • Визначте стратегію простою: короткий простій (остаточна синхронізація) або майже нульовий простій (реплікація).
  • Підготуйте відкат: залиште старий сервер без змін, доки виробниче середовище не буде повністю перевірено.

Короткі команди для інвентаризації (виконувати на вихідному сервері):

# MySQL version
mysql -V

# Server variables that often matter during migration
mysql -u root -p -e "SHOW VARIABLES LIKE 'version%'; SHOW VARIABLES LIKE 'sql_mode'; SHOW VARIABLES LIKE 'character_set_server'; SHOW VARIABLES LIKE 'collation_server'; SHOW VARIABLES LIKE 'default_authentication_plugin';"

# Database sizes
mysql -u root -p -e "SELECT table_schema AS db, ROUND(SUM(data_length index_length)/1024/1024,2) AS size_mb FROM information_schema.tables GROUP BY table_schema ORDER BY size_mb DESC;"

Виберіть метод міграції

Метод А: Логічний експорт/імпорт (mysqldump) — найбільш універсальний

Найкраще підходить для малих/середніх баз даних і є найбезпечнішим варіантом для різних версій. Ви експортуєте SQL (дані схеми) та імпортуєте їх на новий сервер. Цей метод повільніший за фізичні методи для дуже великих наборів даних, але він передбачуваний і його легко відкотити.

Метод Б: Перехід з використанням реплікації — мінімальний час простою

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

Метод В: Фізичне резервне копіювання/відновлення (для досвідчених користувачів)

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

Покрокова міграція за допомогою mysqldump (безпечна базова лінія)

Крок 1 — Створіть узгоджений дамп (джерельний сервер)

Для InnoDB використовуйте --single-transaction , щоб уникнути блокування таблиць. Також включіть процедури, тригери та події, щоб не втратити логіку додатка.

# Example: dump ONE database with compression
# Use -p to enter password interactively (safer than putting it in the command line)
mysqldump -u root -p 
  --single-transaction --quick 
  --routines --triggers --events 
  --hex-blob 
  --default-character-set=utf8mb4 
  olddb | gzip > olddb-$(date  %F).sql.gz

Якщо у вас є таблиці MyISAM: --single-transaction не забезпечує повного захисту узгодженості для MyISAM. Розгляньте можливість запланованого простою або використання стратегії блокування на читання під час створення дампа (оскільки MyISAM не є транзакційним).

Опціонально: створіть дамп декількох баз даних (явний список):

mysqldump -u root -p 
  --single-transaction --quick 
  --routines --triggers --events 
  --databases db1 db2 db3 | gzip > dbs-$(date  %F).sql.gz

Крок 2 — Безпечне перенесення дампа

Використовуйте SCP або rsync через SSH. Перевірте цілісність за допомогою контрольної суми.

# Create checksum on source
sha256sum olddb-2025-08-01.sql.gz > olddb-2025-08-01.sql.gz.sha256

# Transfer to destination
scp olddb-2025-08-01.sql.gz olddb-2025-08-01.sql.gz.sha256 user@NEW_SERVER_IP:/tmp/

У місці призначення перевірте:

cd /tmp
sha256sum -c olddb-2025-08-01.sql.gz.sha256

Крок 3 — Створіть базу даних із правильним набором символів/колацією

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

# Check source defaults
mysql -u root -p -e "SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME='olddb';"

Створіть на місці призначення:

mysql -u root -p -e "CREATE DATABASE olddb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"

Крок 4 — Імпортуйте дамп (сервер призначення)

# Import compressed dump
gunzip -c /tmp/olddb-2025-08-01.sql.gz | mysql -u root -p olddb

Порада для великих імпортів: запустіть процес у сеансі screen/tmux і переконайтеся, що на місці призначення є достатньо місця на диску для журналів та тимчасових файлів.

Крок 5 — Перенесіть користувачів та права доступу (НЕ пропускайте)

Об’єктів бази даних (таблиць) недостатньо — необхідно відтворити облікові записи користувачів та права доступу вашої програми.

На вихідному сервері перелічіть несистемних користувачів:

mysql -u root -p -e "SELECT user, host FROM mysql.user WHERE user NOT IN ('mysql.sys','mysql.session','mysql.infoschema') ORDER BY user, host;"

Для кожного користувача додатка (наприклад: appuser), експортуйте визначення:

mysql -u root -p -e "SHOW CREATE USER 'appuser'@'%';"
mysql -u root -p -e "SHOW GRANTS FOR 'appuser'@'%';"

Потім відтворіть їх на сервері призначення. Приклад (налаштуйте plugin/password відповідно до вашого середовища):

# Example: create user and grant permissions
mysql -u root -p -e "CREATE USER 'appuser'@'%' IDENTIFIED BY 'STRONG_PASSWORD_HERE';"
mysql -u root -p -e "GRANT ALL PRIVILEGES ON olddb.* TO 'appuser'@'%'; FLUSH PRIVILEGES;"

Примітка щодо сумісності: за замовчуванням MySQL 8 використовує caching_sha2_password. Деякі старі клієнти вимагають mysql_native_password. Якщо ваша програма застаріла, заплануйте це перед переходом (але використовуйте сучасну автентифікацію, коли це можливо).

Крок 6 — Перевірте цілісність перед переходом у виробництво

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

# Compare table counts by schema
mysql -u root -p -e "SELECT table_name, table_rows FROM information_schema.tables WHERE table_schema='olddb' ORDER BY table_rows DESC LIMIT 20;"

Для більш глибокої перевірки (рекомендується для критичних систем):

  • Проведіть тести на працездатність додатка на новій БД (вхід, створення об’єкта, читання/запис).
  • Перевірте повільні запити та журнали помилок після імпорту.
  • Якщо ви використовуєте Percona Toolkit, порівняння контрольних сум ідеально підходить для великих наборів даних.

Як мінімізувати час простою (практичний план переходу)

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

  1. Оголосіть про вікно технічного обслуговування та зупиніть записи в додатку (режим технічного обслуговування).
  2. Зробіть остаточний дамп (менший, якщо більшість даних вже було перенесено раніше).
  3. Імпортуйте остаточний дамп у місце призначення.
  4. Переведіть конфігурацію додатка / DNS на новий кінцевий пункт бази даних.
  5. Відстежуйте помилки та продуктивність; залиште стару БД недоторканою для відкоту.

Правила безпеки (не відкривайте MySQL)

  • Не відкривайте MySQL для публічного доступу в Інтернеті, якщо це не є абсолютно необхідним.
  • Обмежте доступ до порту 3306 за IP-адресою (лише сервер додатків) або використовуйте SSH-тунель/VPN.
  • Використовуйте облікові записи з мінімальними привілеями (без прав root для додатків).
  • Шифруйте резервні копії та контролюйте доступ до файлів дампів.
  • Зберігайте резервні копії на окремому сховищі та перевіряйте можливість відновлення.

Висновок

Безпечна міграція бази даних MySQL — це, перш за все, узгодженість (правильні параметри дампа), безпека (безпечна передача, обмежений доступ) та перевірка (перевірки перед переходом). Більшість команд використовують MySQL на VPS під управлінням Linux, але міграції часто стосуються додатків на VPS під управлінням Windows. Завдяки стабільним ресурсам VPS-хостингу та чіткому плану міграції стають передбачуваними та повторюваними.

Prev
Menu