// Engineering Log

Базы данных: Часть 2 — MySQL

Опубликовано 21.09.2026

// Быстрый маршрут

Эта статья относится к теме Серверы и инфраструктура.

MySQL — реляционная СУБД, которая с конца 1990-х годов остаётся одной из самых распространённых в веб-разработке. На ней работают WordPress, Joomla, Drupal, многие интернет-магазины и форумы, её поддерживает практически любой хостинг. С 2010 года MySQL принадлежит Oracle: бесплатная версия Community Server распространяется под лицензией GPLv2, коммерческая Enterprise Edition — по подписке.

Версии и поддержка

С 2023 года Oracle выпускает MySQL двумя потоками:

  • LTS (Long-Term Support) — стабильные ветки, которые получают исправления и обновления безопасности в течение многих лет без изменения функциональности. Сейчас это 8.4 LTS (поддержка до апреля 2032 года с учётом расширенной) и 9.7 LTS, вышедшая весной 2026 года;
  • Innovation — ежеквартальные выпуски с новыми функциями, каждый поддерживается только до выхода следующего.

Для рабочих систем следует выбирать LTS. Ветка 8.0 больше не поддерживается: расширенная поддержка закончилась в апреле 2026 года, и серверы на ней нужно переводить на 8.4 или 9.7.

В сентябре 2025 года Oracle сократила около 70 разработчиков команды MySQL; по сообщениям отраслевых изданий, команду перевели в подразделение облачного сервиса HeatWave. Часть сообщества восприняла это как признак того, что бесплатная версия будет развиваться медленнее. Это весомый довод присмотреться к совместимым альтернативам.

Альтернативы: MariaDB и Percona Server

  • MariaDB — форк MySQL, созданный в 2009 году одним из авторов MySQL Михаэлем Видениусом. Долгое время был прямой заменой MySQL, но с годами ветки разошлись: миграция между современными версиями возможна, однако уже требует проверки. Актуальные LTS-ветки MariaDB — 10.11, 11.4, 11.8 и 12.3. Во многих дистрибутивах Linux пакет «mysql» по умолчанию ставит именно MariaDB.
  • Percona Server for MySQL — сборка MySQL от компании Percona, полностью совместимая с оригиналом, с дополнительными инструментами диагностики и функциями, которые у Oracle есть только в Enterprise-версии.

Где MySQL уместен

  • Сайты на CMS и фреймворках. WordPress официально поддерживает MySQL и MariaDB; для него это естественный выбор.
  • Интернет-магазины и веб-сервисы с преобладанием чтения: MySQL хорошо справляется с большим числом простых запросов.
  • Небольшие корпоративные системы — CRM, учёт заявок, внутренние сервисы, если приложение рассчитано на MySQL.

Если проект начинается с нуля и жёстких требований к СУБД нет, стоит сравнить MySQL с PostgreSQL: у PostgreSQL богаче набор типов данных и расширений, и он не зависит от одной компании.

Как устроен MySQL

Движки хранения

MySQL хранит таблицы с помощью подключаемых движков. По умолчанию используется InnoDB: он поддерживает транзакции, внешние ключи, блокировки на уровне строк и восстановление после сбоев. Старый движок MyISAM транзакций не поддерживает, блокирует таблицу целиком при записи и после аварии может потребовать ремонта таблиц. Для новых таблиц его использовать не стоит, а старые разумно перевести на InnoDB:

sql
ALTER TABLE имя_таблицы ENGINE=InnoDB;

Репликация

Репликация копирует изменения с основного сервера на один или несколько резервных. Начиная с версии 8.0.22 MySQL использует термины source (источник) и replica (реплика) вместо устаревших master и slave; команды тоже переименованы: START REPLICA, SHOW REPLICA STATUS, CHANGE REPLICATION SOURCE TO.

Реплики используют для:

  • распределения нагрузки на чтение;
  • резервного сервера на случай отказа основного;
  • снятия резервных копий без нагрузки на основной сервер.

Для автоматического переключения при отказе и записи на несколько узлов существует Group Replication и построенный на ней InnoDB Cluster.

Базовая настройка

Отдельный пользователь для каждого приложения

Приложение не должно подключаться к базе под root. Для каждого приложения создают отдельную базу и пользователя с правами только на неё:

sql
CREATE DATABASE shop CHARACTER SET utf8mb4;
CREATE USER 'shop'@'localhost' IDENTIFIED BY 'надёжный_пароль';
GRANT SELECT, INSERT, UPDATE, DELETE ON shop.* TO 'shop'@'localhost';

Если приложение само создаёт и изменяет таблицы при обновлениях, к правам добавляют CREATE, ALTER, INDEX и DROP. Часть @'localhost' означает, что подключаться можно только с того же сервера. Открывать доступ с любого адреса ('%') без необходимости не следует.

Кодировку лучше задавать utf8mb4: старая utf8 в MySQL хранит не все символы Юникода, например не сохраняет эмодзи.

Резервное копирование

mysqldump создаёт логическую копию — набор SQL-команд, из которых база восстанавливается. Для таблиц InnoDB ключ --single-transaction делает согласованный снимок без блокировки работы приложения:

bash
mysqldump --single-transaction --routines --triggers --events shop > shop.sql

Восстановление:

bash
mysql shop < shop.sql

Логическая копия удобна для небольших баз и переноса между версиями, но на базах в десятки гигабайт её создание и особенно восстановление занимает часы. Для больших баз применяют физическое копирование:

  • Percona XtraBackup копирует файлы данных без остановки сервера. Версия XtraBackup должна соответствовать ветке сервера: XtraBackup 8.4 работает только с MySQL 8.4;
  • MySQL Shell с утилитами util.dumpInstance() и util.loadDump() создаёт и восстанавливает копии в несколько потоков.

Резервная копия, которую ни разу не восстанавливали, не даёт уверенности в сохранности данных: восстановление нужно регулярно проверять на отдельном сервере.

Инструменты администрирования

  • mysql — консольный клиент, входит в поставку сервера.
  • MySQL Shell — современный клиент с режимами SQL, JavaScript и Python, утилитами резервного копирования и проверки готовности к обновлению (util.checkForServerUpgrade()).
  • phpMyAdmin и Adminer — веб-интерфейсы, привычные пользователям хостинга. Публиковать их в интернет без дополнительной защиты (ограничения по IP-адресу, отдельной авторизации) не следует: их постоянно сканируют боты.
  • MySQL Workbench и DBeaver — настольные программы для работы со схемой и запросами.

Типичные ошибки

  • Устаревший способ аутентификации. Плагин mysql_native_password отключён по умолчанию в MySQL 8.4 и удалён в 9.0; по умолчанию используется caching_sha2_password. Старые клиенты и драйверы после обновления сервера могут перестать подключаться — их нужно обновить заранее.
  • Настройки по умолчанию на рабочем сервере. Главный параметр производительности InnoDB — innodb_buffer_pool_size, объём памяти под кеш данных. На выделенном сервере БД его обычно ставят в 50–75 % оперативной памяти.
  • Порт 3306, открытый в интернет. Сервер базы данных должен быть доступен только приложению: слушать 127.0.0.1 или внутреннюю сеть, либо быть закрыт межсетевым экраном.
  • Отсутствие индексов. Медленные запросы находят через журнал медленных запросов (slow_query_log) и разбирают командой EXPLAIN.
  • Обновление без проверки. Переход между ветками (8.0 → 8.4 → 9.7) делают через проверку совместимости на копии базы: изменились параметры по умолчанию, часть устаревших функций удалена.

Итог

MySQL — зрелая СУБД с огромной экосистемой и естественный выбор для сайтов на популярных CMS. Для рабочих систем стоит использовать ветку LTS, настроить резервное копирование с проверкой восстановления и следить за тем, как Oracle развивает бесплатную версию. Если зависимость от одной компании критична, совместимые MariaDB и Percona Server позволяют сменить поставщика без переписывания приложения.

// Похожая задача

Если у вас похожая ситуация

Эта статья относится к одной из рабочих тем. Можно продолжить чтение по теме, перейти на главную, чтобы понять, чем я занимаюсь, или сразу открыть услуги.

Тема статьи

Серверы и инфраструктура

VPS, Linux, веб-стек, миграции, хостинг, базы данных и базовая эксплуатация.

Часто с этим приходят

  • Перенести сайт или сервис на новый сервер
  • Настроить Linux, Nginx, базу данных и бэкапы
  • Разобраться, почему всё работает нестабильно

// Следующий шаг

Если вам нужна не только статья, а помощь по этой теме, удобнее сразу перейти в услугу. Главная и подборка материалов остаются рядом.

Открыть услуги

// Contact

Нужна помощь?

Свяжись со мной и я помогу решить проблему

Написать в Telegram

Отвечаю в течение рабочего дня (03:00–13:00 GMT)

Или оставьте заявку здесь:

Подтвердите, что вы не бот.

Написать и получить быстрый ответ