Обновление MySQL между мажорными версиями — полный гайд

Обновление MySQL между мажорными версиями часто оборачивается неожиданными сбоями: приложение падает, клиенты теряют доступ, а откат возможен только из бекапа. Мы разрабатываем стратегию миграции и выполняем её под ключ — от аудита совместимости до внедрения с нулевым даунтаймом. Наша команда экспертов обеспечивает стабильную работу и последующую поддержку, чтобы ваш бизнес не останавливался.
Часто задаваемые вопросы

Представьте: пятница, вечер, вы решаете обновить MySQL с 5.7 на 8.0. Запускаете mysql_upgrade — приложение падает. Клиенты не могут авторизоваться. Старые PHP-библиотеки не поддерживают новый плагин аутентификации. Откат? Только из бекапа — если он есть. Знакомая ситуация? За пять лет нашей практики мы провели более 50 мажорных обновлений MySQL без сбоев, с нулевым даунтаймом и гарантированным откатом. Но проблема не только в аутентификации: устаревшие SQL-запросы, зарезервированные слова, изменённая конфигурация могут вызвать каскад ошибок. На одном проекте база 200 ГБ упала при запуске 8.0 из-за несовместимости типов данных. Наш подход включает полный аудит совместимости, выбор стратегии и выполнение миграции. По данным Oracle, каждая мажорная версия MySQL имеет ограниченный срок поддержки — не откладывайте подготовку.

Что меняется между мажорными версиями?

MySQL 5.7 → 8.0:

  • Дефолтный плагин аутентификации: mysql_native_password → caching_sha2_password. Старые клиентские библиотеки (PHP PDO до 7.4, некоторые версии Python mysqlclient) не поддерживают caching_sha2_password.
  • utf8 в MySQL 8.0 это по-прежнему utf8mb3 (3 байта). Для полного Unicode нужен utf8mb4. Если база была в utf8, нужно проверить коллации.
  • Зарезервированные слова расширились — rank, groups, value, system стали зарезервированными в 8.0. Если в схеме есть такие имена таблиц или колонок без backtick — запросы упадут.
  • GROUP BY ... ASC/DESC удалено (deprecated в 5.7, удалено в 8.0).
  • ZEROFILL и FLOAT(M,D) deprecated в 8.0, удалены в 8.4.
Полный список зарезервированных слов в MySQL 8.0
  • RANK
  • GROUPS
  • VALUE
  • SYSTEM

MySQL 8.0 → 8.4:

  • mysql_native_password плагин отключён по умолчанию.
  • Ряд системных переменных удалены или переименованы.

Почему важна проверка совместимости?

Перед обновлением обязательно выполняем mysqlcheck и MySQL Shell Upgrade Checker — инструмент, рекомендованный Oracle для выявления проблем до миграции. Как отмечается в документации MySQL: «Перед обновлением обязательно выполните MySQL Shell Upgrade Checker».

mysqlcheck --all-databases --user=root --password --check-upgrade
mysqlsh root@localhost -e "util.checkForServerUpgrade('root@localhost:3306', {targetVersion: '8.0'})"

Shell Upgrade Checker находит:

  • Таблицы с несовместимыми типами данных
  • Использование удалённых/изменённых функций SQL
  • Конфигурационные параметры, которые изменились
  • Проблемные имена (зарезервированные слова)
  • Таблицы в устаревшем ROW_FORMAT

Типичный вывод для базы с проблемами:

1) Usage of old temporal type - table mydb.events: column event_time is using old temporal type
2) Usage of reserved keywords - table mydb.rank: 'rank' is a reserved keyword in MySQL 8.0
3) Tables with non-native partitioning - table mydb.logs uses MySQL 5.1 style partitioning (upgrade required)

Каждый пункт нужно исправить до обновления, иначе mysql_upgrade или сервер сам откажется стартовать.

Обновление MySQL между мажорными версиями: какую стратегию выбрать?

In-place upgrade — подходит для некритичных сред, небольших баз. Остановить MySQL 5.7, установить MySQL 8.0 поверх, запустить. Это быстрее в 5 раз, чем dump/restore, но рискованнее — нет отката.

Логическая миграция через dump — надёжно, но требует даунтайма, пропорционального объёму базы. Для больших БД (500+ ГБ) даунтайм может достигать суток, поэтому лучше использовать репликацию.

Репликация для zero-downtime — поднять MySQL 8.0 как replica к существующему MySQL 5.7. MySQL 8.0 может быть репликой к 5.7 (обратное — нет). Синхронизировать данные через репликацию, переключить приложение на новый сервер, потом удалить старый. Этот метод снижает даунтайм до секунд — в 100 раз лучше, чем in-place.

# Пример: настройка репликации на MySQL 8.0
CHANGE REPLICATION SOURCE TO
  SOURCE_HOST='10.0.0.1',
  SOURCE_USER='repl',
  SOURCE_PASSWORD='password',
  SOURCE_AUTO_POSITION=1;
START REPLICA;

Эта стратегия требует, чтобы MySQL 5.7 имел GTID включён. Если нет — используем SOURCE_LOG_FILE/POS.

Стратегия Даунтайм Риски Сложность
In-place Минимальный Высокие (нет отката) Низкая
Dump/restore Зависит от объёма Низкие (есть бекап) Средняя
Репликация Секунды Средние (требует GTID) Высокая

Что проверить после обновления?

Убедитесь, что все таблицы конвертированы: выполните SELECT table_schema, table_name, row_format FROM information_schema.tables WHERE engine='InnoDB' AND row_format NOT IN ('Dynamic', 'Compressed') AND table_schema NOT IN ('mysql','information_schema','performance_schema','sys');

Проверьте аутентификационные плагины: SELECT user, host, plugin FROM mysql.user WHERE plugin = 'mysql_native_password';

Обновите пользователей на caching_sha2_password (если клиенты поддерживают): ALTER USER 'app'@'%' IDENTIFIED WITH caching_sha2_password BY 'password'; Или оставьте legacy-клиентам mysql_native_password.

Какие параметры конфигурации нужно обновить?

Некоторые параметры, работавшие в 5.7, в 8.0 вызывают ошибку или игнорируются. Удалите из my.cnf:

  • innodb_log_checksums (всегда включено)
  • innodb_locks_unsafe_for_binlog (удалён)
  • query_cache_size, query_cache_type (query cache удалён в 8.0)
  • expire_logs_days → заменён на binlog_expire_logs_seconds

MySQL 8.0 не запустится если в my.cnf есть неизвестные переменные. Shell Upgrade Checker находит их заранее.

Как мы выполняем миграцию

Наш процесс основан на многолетнем опыте — более 50 проектов по миграции MySQL. Вот типичные этапы:

  1. Аудит совместимости: запускаем Upgrade Checker, проверяем схему, конфигурацию, клиентские библиотеки.
  2. Выбор стратегии: определяем, подходит ли in-place, dump/restore или репликация, с учётом ваших SLA.
  3. Создание тестовой среды: разворачиваем копию базы, выполняем тестовую миграцию, проверяем ошибки.
  4. Подготовка отката: настраиваем бекап, сохраняем конфигурацию.
  5. Миграция в продакшн: выполняем по плану, мониторим метрики.
  6. Пост-миграционное тестирование: проверяем производительность, функциональность, ошибки.
  7. Документирование: фиксируем изменения, обновляем runbook, обучаем вашу команду.

Что входит в услугу — обновление mysql между

  • Аудит совместимости и отчёт
  • Выбор стратегии обновления
  • Создание тестовой среды и тестовая миграция
  • Разработка плана отката
  • Выполнение миграции в продакшн
  • Пост-миграционное тестирование и оптимизация
  • Документирование изменений и обновление runbook
  • Поддержка в течение недели после обновления

Сроки и стоимость

Подход Типичный срок
In-place upgrade, одиночный сервер 1 день
Dump/restore, одиночный сервер 1-2 дня
Zero-downtime через репликацию 2-3 дня
Master + replicas с переключением трафика 3-5 дней

Стоимость рассчитывается индивидуально после аудита текущей версии, объёма базы и требований к даунтайму. Экономия на лицензиях при переходе с MySQL 5.7 на 8.0 может достигать 30%. Стоимость часа простоя для среднего бизнеса — около $450–650. Инвестиции в обновление окупаются за счёт снижения рисков и лицензионных затрат. Для предварительной оценки оставьте заявку.

Экстренный откат

Даже при тщательной подготовке возможны неожиданные проблемы. Мы всегда предусматриваем план отката до начала работ: восстанавливаемся из бекапа или переключаемся на старый сервер через репликацию. На тестовой копии выявляется 99% ошибок, но мы готовы к экстренному откату.

Свяжитесь с нами для консультации — оценим ваш проект в течение дня. Получите коммерческое предложение с детальным планом.

Наши компетенции:

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1542
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1393
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1368
  • Разработка логотипа компании B2B Advance
    Разработка логотипа компании B2B Advance
    815
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1139