MySQL vs MariaDB: ключові відмінності
| Параметр | MySQL 8.0 | MariaDB 10.x |
|---|---|---|
| Ліцензія | GPL + комерційна (Oracle) | GPL (повністю open source) |
| Продуктивність | Добра | Часто краща для читання |
| Сумісність | Базова (SQL) | drop-in заміна для MySQL 5.7 |
| Galera Cluster | Немає (InnoDB Cluster окремо) | Вбудований |
| Рушії | InnoDB, MyISAM | InnoDB, Aria, ColumnStore |
Крок 1: Бекап даних MySQL
mysqldump -u root -p --all-databases --single-transaction \
--routines --triggers > /backup/mysql_full_$(date +%Y%m%d).sql
# Перевірити розмір
ls -lh /backup/mysql_full_*.sqlКрок 2: Видалення MySQL
sudo systemctl stop mysql
sudo apt remove --purge mysql-server mysql-client mysql-common
sudo rm -rf /var/lib/mysql
sudo apt autoremovemysql -u root -p -e "SHOW DATABASES;" з бекапом — переконайтеся, що дані на місці.Крок 3: Встановлення MariaDB
sudo apt update
sudo apt install mariadb-server mariadb-client
# Для останньої версії з офіційного репозиторію:
curl -LsS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash
sudo apt install mariadb-serverКрок 4: Початкове налаштування
sudo mariadb-secure-installation
# або
sudo mysql_secure_installationКрок 5: Імпорт даних
# Перевіряємо підключення
mysql -u root -p -e "SELECT VERSION();"# Імпорт бекапа
mysql -u root -p < /backup/mysql_full_*.sqlКрок 6: Перевірка після міграції
# Список баз даних
mysql -u root -p -e "SHOW DATABASES;"
# Перевірити таблиці
mysql -u root -p -e "USE mydb; SHOW TABLES; CHECK TABLE orders;"
# Тест застосунку
curl -I https://yoursite.comТипові помилки під час міграції
Більшість проблем виникають не на етапі експорту, а під час першого підключення застосунку до нового сервера.
| Помилка | Причина | Рішення |
|---|---|---|
| ERROR 1045 (28000): Access denied for user | MariaDB заново створює таблицю mysql.user, старі хеші паролів не підходять | Перестворити користувача через CREATE USER після імпорту |
| ERROR 2002: Can't connect through socket | MariaDB використовує інший шлях до сокета, ніж MySQL | Перевірити socket у my.cnf і в конфігу застосунку |
| ERROR 1146: Table doesn't exist | Регістр імен таблиць відрізняється на файловій системі після перенесення на іншу ОС | Виставити lower_case_table_names однаково на старому і новому сервері |
Сумісність: що може зламатися
MariaDB — не побітова копія MySQL, і частина відмінностей проявляється лише під навантаженням.
- Плагін автентифікації: MySQL 8.0 за замовчуванням використовує
caching_sha2_password, MariaDB —mysql_native_password. Старі драйвери PHP/Python можуть не розуміти caching_sha2_password, тому міграція у бік MariaDB зазвичай минає гладко, а зворотна — ні. - Функції JSON частково відрізняються: частина функцій MySQL 8.0 (наприклад, деякі агрегатні JSON-функції) у MariaDB реалізовані інакше або відсутні.
- Оптимізатор запитів будує інші плани для одного й того ж SQL — після міграції обов'язково прожене важкі запити через
EXPLAINі порівняйте з логом до перенесення. - Репліки на старому MySQL не підключаються до майстра на MariaDB і навпаки — протоколи реплікації розійшлися починаючи з MariaDB 10.x.
- Кодування за замовчуванням відрізняється: MySQL 8.0 використовує collation
utf8mb4_0900_ai_ci, MariaDB —utf8mb4_general_ciабоutf8mb4_unicode_ci. Сортування рядків і порівняння без урахування регістру можуть дати інший результат для тих самих даних.
Коли міграція на MariaDB не підходить
Залишайтеся на MySQL, якщо застосунок жорстко залежить від функцій, яких немає в MariaDB: window functions з окремими розширеннями MySQL 8.0, MySQL Document Store (X Protocol), або якщо використовується managed-сервіс хмарного провайдера, який підтримує лише один із рушіїв без міграції даних назовні. Також не варто мігрувати «про всяк випадок» прямо перед піковим навантаженням — спочатку перевірте зміну на тестовому сервері з копією продової бази.
Перевірка сумісності перед перемиканням трафіку
-- Порівняти версії та режими SQL
SELECT VERSION();
SHOW VARIABLES LIKE 'sql_mode';
-- Прогнати типовий важкий запит і порівняти план
EXPLAIN SELECT o.id, u.email FROM orders o
JOIN users u ON u.id = o.user_id
WHERE o.status = 'paid' AND o.created_at > NOW() - INTERVAL 7 DAY;
-- Перевірити стан InnoDB після навантажувального тесту
SHOW ENGINE INNODB STATUS\GЯкщо sql_mode відрізняється від початкового сервера, частина INSERT-запитів з неявним приведенням типів може почати падати з помилкою замість тихого округлення — звірте значення перед перемиканням продакшн-трафіку. Детальніше про безпечне перенесення даних без правки початкової бази — у статті про mysqldump і відновлення, а про тонке налаштування нового сервера — у статті про оптимізацію my.cnf.