К основному содержимому

Миграция с MySQL на MariaDB: отличия и совместимость

MySQL / MariaDB · 19.04.2026 · 4 мин чтения
Иллюстрация к статье «Миграция с MySQL на MariaDB: отличия, совместимость и пошаговый переход»

MySQL vs MariaDB: ключевые отличия

ПараметрMySQL 8.0MariaDB 10.x
ЛицензияGPL + коммерческая (Oracle)GPL (полностью open source)
ПроизводительностьХорошаяЧасто лучше для чтения
СовместимостьБазовая (SQL)drop-in замена для MySQL 5.7
Galera ClusterНет (InnoDB Cluster отдельно)Встроен
ДвижкиInnoDB, MyISAMInnoDB, 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 autoremove
Убедитесь, что бэкап создан и проверен перед удалением MySQL. Выполните mysql -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
MariaDB полностью совместима с MySQL 5.7 на уровне протокола — большинство приложений (WordPress, Laravel, etc.) работают без изменений в конфигурации.

Типичные ошибки при миграции

Большинство проблем возникают не на этапе экспорта, а при первом подключении приложения к новому серверу.

ОшибкаПричинаРешение
ERROR 1045 (28000): Access denied for userMariaDB заново создаёт таблицу mysql.user, старые хэши паролей не подходятПересоздать пользователя через CREATE USER после импорта
ERROR 2002: Can't connect through socketMariaDB использует другой путь к сокету, чем 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.

Статья помогла?
← Назад в базу знаний Задать вопрос поддержке