MySQL 8.4 - перша LTS-версія в новій моделі випусків: LTS отримують лише виправлення протягом довгого часу, а нові можливості виходять у проміжних Innovation-версіях (9.x). Оновлення 8.0 → 8.4 підтримується напряму. Відкат до 8.0 на тих самих файлах не підтримується - лише з бекапу.
Що ламається найчастіше:
1. mysql_native_password вимкнено за замовчуванням. Облікові записи зі старим плагіном після оновлення не увійдуть. Перед оновленням:
SELECT user, host FROM mysql.user WHERE plugin = 'mysql_native_password';
ALTER USER 'app'@'%' IDENTIFIED WITH caching_sha2_password BY '...';
Тимчасово плагін можна ввімкнути (mysql_native_password = ON), але в MySQL 9 його видалено.
2. Видалено старий синтаксис реплікації. CHANGE MASTER TO, START SLAVE, SHOW SLAVE STATUS, SHOW MASTER STATUS, RESET MASTER і опції MASTER_* більше не існують. Треба оновити скрипти, системи моніторингу, Ansible-ролі, інструменти перемикання:
| Було | Стало |
|---|---|
CHANGE MASTER TO MASTER_HOST=... |
CHANGE REPLICATION SOURCE TO SOURCE_HOST=... |
SHOW SLAVE STATUS |
SHOW REPLICA STATUS |
SHOW MASTER STATUS |
SHOW BINARY LOG STATUS |
RESET MASTER |
RESET BINARY LOGS AND GTIDS |
3. Видалено утиліту mysqlpump - замінити на mysqldump чи утиліти MySQL Shell.
4. Змінено значення за замовчуванням InnoDB - продуктивність може змінитися навіть без змін конфігурації:
innodb_adaptive_hash_index:ON→OFF;innodb_change_buffering:all→none;innodb_io_capacity: 200 → 10000;innodb_log_buffer_size: 16 МБ → 64 МБ;temptable_max_ram: 1 ГБ → 3% пам'яті (у межах 1-4 ГБ).
Ці зміни відображають сучасні SSD, але для навантажень, що виграють від адаптивного хеш-індексу, варто порівняти продуктивність до і після.
5. Застарілі й видалені змінні в my.cnf. Сервер не стартує з невідомою змінною. Перевірити конфігурацію на тестовому інстансі.
Процес оновлення:
- перевірка сумісності -
util.checkForServerUpgrade()з MySQL Shell: знаходить застарілі плагіни, синтаксис, проблеми схеми; - оновлення на копії продакшену, прогін тестів застосунку і порівняння планів найважливіших запитів;
- на продакшені - спершу репліки (новіша репліка може реплікувати зі старішого джерела, навпаки - ні), потім перемикання джерела на оновлену репліку;
- бекап безпосередньо перед оновленням і план відкату (повернення на стару репліку).
Для Laravel сама версія MySQL майже не важлива: драйвер pdo_mysql сучасного PHP підтримує все потрібне. Але варто переконатися, що в CI використовується та ж версія MySQL, що й у продакшені.