MariaDB в systemd: разбор отказов
MariaDB во многом повторяет MySQL, но unit-файл у неё свой и устроен аккуратнее: есть предварительные проверки, отдельный таймаут на восстановление и вспомогательные unit. Разбор отказов при этом тот же: собственный журнал ошибок, права каталога данных, память.
О службе
Unit MariaDB включает предварительные команды, которые проверяют каталог данных и создают нужные подкаталоги в /run. Если падает одна из них, в статусе виден код от ExecStartPre, а не от сервера — как у nginx. Это сразу сужает поиск: до запуска сервера дело не дошло.
Отдельно стоит режим восстановления после сбоя. MariaDB может восстанавливаться долго, и в дистрибутивных unit-файлах для этого предусмотрен большой таймаут. Если вы переопределяли TimeoutStartSec=, убедитесь, что значение не меньше времени восстановления.
В кластерных установках (Galera) добавляется отдельная логика первого узла. Там отказ запуска часто связан не с самой базой, а с состоянием кластера: узел не может определить, у кого актуальные данные. Это разбирается в терминах кластера, а не systemd.
Как устроена
| Имя unit | mariadb.service, есть также mariadb@.service для нескольких экземпляров |
|---|---|
| Журнал ошибок | по умолчанию идёт в журнал systemd, при настройке — в /var/log/mysql/error.log |
| Каталог данных | /var/lib/mysql, владелец mysql:mysql |
| Предварительные проверки | в unit есть ExecStartPre= — их код вы увидите при отказе |
| Кластер | при Galera отказ запуска может быть связан с состоянием кластера, а не с базой |
Частые ошибки
14 записей базы отмечены за этой службой.
Коды выхода
- status=1/FAILURE в systemdКод 1/FAILURE означает, что программа запустилась и сама завершилась с ошибкой. Как найти настоящую причину в журнале службы.
Сообщения журнала
- Permission denied в журнале службыОтказ в доступе у службы systemd: права на файл, каталоги по пути, пользователь службы, параметры изоляции, SELinux и AppArmor.
- Address already in use при запуске службыПорт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
Состояния результата
- Failed with result 'timeout'Состояние timeout: служба не уложилась в отведённое время при запуске, остановке или перезагрузке настроек.
- Failed with result 'oom-kill'Состояние oom-kill: процесс службы убит из-за нехватки памяти. Как понять, упёрлись в предел службы или в память машины.
Ресурсы и ограничения
- No space left on device в журнале службыНет места на устройстве: разбор по свободным блокам, по inode, по журналу systemd и по удалённым, но открытым файлам.
Ошибки служб
- MariaDB Galera: узел не стартует без bootstrapКластер Galera не поднимается после полной остановки: нужен запуск первого узла особой командой и файл grastate.dat.
- MySQL убит из-за памяти: буферный пул больше доступной памятиMySQL падает сразу после старта или через минуты: размер innodb_buffer_pool_size превышает память машины.
- MySQL: Can't connect to local server through socketКлиент не находит unix-сокет MySQL: сервер не запущен, путь к сокету другой, каталог в /run не создан.
- MySQL: Can't open the mysql.plugin table и повреждение системных таблицMySQL не запускается: недоступны или повреждены системные таблицы. Права на каталог данных, версия схемы, восстановление.
- MySQL: InnoDB не запускается после аварийного завершенияОшибки InnoDB при старте: повреждение страниц, несовпадение журнала, режим принудительного восстановления.
- MySQL: Too many connectionsБаза отказывает в новых подключениях: исчерпан max_connections или предел дескрипторов службы.
- MySQL: журнал двоичных изменений заполнил дискМесто кончилось из-за binlog: не настроена очистка, отстала репликация, слишком большой срок хранения.
- MySQL: репликация остановилась с ошибкойПодписчик перестал применять изменения: конфликт данных, пропущенная транзакция, недоступный основной сервер.
Коды выхода этой службы
Числа в status=N ниже 200 назначает сама программа, 200 и выше — systemd, когда не смог подготовить запуск.
Диагностика
Показывает, упала предварительная команда или сам сервер.
systemctl status mariadb --no-pager -lMariaDB по умолчанию пишет ошибки прямо в журнал systemd.
journalctl -u mariadb -n 60 --no-pagerРазбор настроек без запуска.
sudo mariadbd --help --verbose 2>&1 | head -20 || sudo mysqld --validate-configПрава на каталог данных и на каталог в /run.
sudo ls -ld /var/lib/mysql /run/mysqldПараметры unit, которые тут важны
- ExecStartPre=проверки каталога данных до запуска сервера
- TimeoutStartSec=восстановление после сбоя требует запаса времени
- LimitNOFILE=много открытых файлов таблиц под нагрузкой
- User=работа от mysql; владелец каталога данных должен совпадать
Источники
- Документация MariaDB: systemd
- Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)