
Міграція бази даних MySQL — це операція, що має значний вплив: вона впливає на цілісність даних, час безвідмовної роботи додатків та безпеку відкату. У цьому посібнику описано перевірений алгоритм міграції з використанням mysqldump (найбільш універсальний варіант) та пояснено, як скоротити час простою за допомогою «остаточної синхронізації» або реплікації.
MySQL найчастіше розміщується на VPS під управлінням Linux, але міграція може стосуватися й додатків на VPS під управлінням Windows. У будь-якому разі стабільна продуктивність мережі та диска від вашого провайдера VPS-хостингу робить міграцію швидшою та безпечнішою.
sql_mode, lower_case_table_names, часовий пояс та налаштування innodb.Короткі команди для інвентаризації (виконувати на вихідному сервері):
# 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;"
Найкраще підходить для малих/середніх баз даних і є найбезпечнішим варіантом для різних версій. Ви експортуєте SQL (дані схеми) та імпортуєте їх на новий сервер. Цей метод повільніший за фізичні методи для дуже великих наборів даних, але він передбачуваний і його легко відкотити.
Ви налаштовуєте новий сервер як репліку, даєте йому наздогнати, а потім перемикаєте трафік додатків. Це може скоротити час простою до декількох хвилин, але вимагає більше кроків і ретельної перевірки.
Такі інструменти, як гаряче резервне копіювання, є найшвидшими для великих наборів даних InnoDB, але вони більш чутливі до версії та конфігурації. Використовуйте їх лише в тому випадку, якщо ви вже впевнено працюєте з такими інструментами.
Для 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
Використовуйте 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
Налаштуйте набір символів та сортування відповідно до вимог вашої програми. Якщо ви не впевнені, спочатку перевірте стандартні налаштування вихідної бази даних.
# 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;"
# Import compressed dump
gunzip -c /tmp/olddb-2025-08-01.sql.gz | mysql -u root -p olddb
Порада для великих імпортів: запустіть процес у сеансі screen/tmux і переконайтеся, що на місці призначення є достатньо місця на диску для журналів та тимчасових файлів.
Об’єктів бази даних (таблиць) недостатньо — необхідно відтворити облікові записи користувачів та права доступу вашої програми.
На вихідному сервері перелічіть несистемних користувачів:
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. Якщо ваша програма застаріла, заплануйте це перед переходом (але використовуйте сучасну автентифікацію, коли це можливо).
Як мінімум, переконайтеся, що схема існує, кількість рядків виглядає прийнятною, а ключові запити працюють.
# 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;"
Для більш глибокої перевірки (рекомендується для критичних систем):
Якщо ви не використовуєте реплікацію, найпоширенішим «безпечним» підходом є короткий період технічного обслуговування:
Безпечна міграція бази даних MySQL — це, перш за все, узгодженість (правильні параметри дампа), безпека (безпечна передача, обмежений доступ) та перевірка (перевірки перед переходом). Більшість команд використовують MySQL на VPS під управлінням Linux, але міграції часто стосуються додатків на VPS під управлінням Windows. Завдяки стабільним ресурсам VPS-хостингу та чіткому плану міграції стають передбачуваними та повторюваними.