До основного вмісту

Міграція з 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.

Чи була стаття корисною?
← Назад до бази знань Поставити питання підтримці