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.