SystemdDoctor
mysql.service база данныхчастое

MySQL в systemd: почему не запускается

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

О службе

MySQL пишет подробный журнал ошибок в отдельный файл (обычно /var/log/mysql/error.log). В журнал systemd попадают лишь несколько строк, из которых причина не видна. Поэтому разбор всегда начинается с собственного файла: там и версия, и параметры запуска, и точное сообщение об ошибке.

Вторая особенность — память. Размер буферного пула InnoDB задаётся в настройках и выделяется при старте. Если он больше доступной памяти, сервер либо не стартует, либо его убивает ядро. На небольших виртуальных машинах это самая частая причина внезапных падений после увеличения настроек.

Третья — запуск от пользователя mysql. Каталог данных должен принадлежать ему целиком. После восстановления из резервной копии под root служба перестаёт стартовать, и лечится это возвратом владельца, а не правкой unit-файла.

Как устроена

Имя unitmysql.service в Debian и Ubuntu, mysqld.service в RHEL
Журнал ошибок/var/log/mysql/error.log — основной источник причин
Каталог данных/var/lib/mysql, владелец mysql:mysql
Проверка настроекmysqld --validate-config в версиях 8.0 и новее
Порт по умолчанию3306; unix-сокет обычно /run/mysqld/mysqld.sock

Частые ошибки

25 записей базы отмечены за этой службой.

Коды выхода

  • status=1/FAILURE в systemdКод 1/FAILURE означает, что программа запустилась и сама завершилась с ошибкой. Как найти настоящую причину в журнале службы.
  • status=205/LIMITS в systemdКод 205/LIMITS: systemd не смог применить ограничения ресурсов из Limit*=. Обычно значение недопустимо или превышает жёсткий предел.

Сообщения журнала

Состояния результата

  • Failed with result 'oom-kill'Состояние oom-kill: процесс службы убит из-за нехватки памяти. Как понять, упёрлись в предел службы или в память машины.
  • Failed with result 'timeout'Состояние timeout: служба не уложилась в отведённое время при запуске, остановке или перезагрузке настроек.
  • Failed with result 'core-dump'Состояние core-dump: процесс службы аварийно завершился и сохранил дамп памяти. Как открыть дамп и прочитать трассировку.
  • Job for … failed because a timeout was exceededЗадание на запуск прервано по таймауту. Как отличить медленный старт от заблокированного и правильно настроить TimeoutStartSec.

Ресурсы и ограничения

Сигналы

  • signal=ABRT (status=6/ABRT) в systemdПроцесс службы завершён сигналом ABRT: программа сама прервала работу после внутренней проверки. Где искать причину.
  • signal=BUS (status=7/BUS) в systemdПроцесс службы завершён сигналом BUS: ошибка доступа к памяти, часто из-за усечённого файла в отображении или заполненного диска.
  • signal=KILL (status=9/KILL) в systemdПроцесс службы убит сигналом KILL. Кто мог его послать: OOM-killer, таймаут остановки systemd, администратор.
  • signal=SEGV (status=11/SEGV) в systemdПроцесс службы завершён сигналом SEGV: обращение к недопустимой памяти. Как собрать дамп и что смотреть.

Конфигурация unit

Ошибки служб

Коды выхода этой службы

Числа в status=N ниже 200 назначает сама программа, 200 и выше — systemd, когда не смог подготовить запуск.

statusЧто означает у этой службыКуда смотреть
1/FAILURE ошибка настроек, права на каталог данных или повреждённые таблицы. разбор
убит сигналом KILL нехватка памяти: чаще всего из-за размера буферного пула InnoDB. разбор
6/ABRT внутренняя проверка InnoDB не прошла — обычно признак повреждения данных. разбор

Диагностика

Главный источник: точное сообщение об ошибке запуска.

sudo tail -60 /var/log/mysql/error.log

Код и сигнал, с которыми завершился процесс.

systemctl status mysql --no-pager -l

Проверка настроек без запуска сервера (MySQL 8.0 и новее).

sudo mysqld --validate-config

Владелец каталога данных и его размер.

sudo ls -ld /var/lib/mysql && sudo du -sh /var/lib/mysql

Память машины и пределы службы: для падений по KILL это главные числа.

free -h && systemctl show mysql -p MemoryMax -p MemoryPeak

Параметры unit, которые тут важны

  • LimitNOFILE=MySQL открывает много файлов таблиц; значение по умолчанию мало
  • MemoryMax=ограничение памяти базе задавать только с учётом буферного пула
  • TimeoutStartSec=восстановление InnoDB после сбоя может занять минуты
  • User=служба работает от mysql, каталог данных должен принадлежать ему

Источники