MySQL: InnoDB не запускается после аварийного завершения
InnoDB проверяет целостность при запуске и отказывается работать при расхождениях. Причины — аварийное выключение, заполненный диск, проблемы носителя. Признак — сообщения об ошибке страниц или журнала и аварийное завершение сервера.
Что это значит
Есть режим принудительного восстановления (innodb_force_recovery), который позволяет поднять сервер для выгрузки данных. Это средство для спасения данных, а не для продолжения работы: после выгрузки базу нужно создать заново.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Повреждение после аварийного выключения
InnoDB рассчитывает на корректную запись журнала. Отключение питания или зависание оставляют его в несогласованном состоянии.
-
Диск был заполнен во время записи
Нехватка места прерывает запись журнала и табличных файлов. После освобождения места данные могут остаться несогласованными.
-
Проблемы носителя
Ошибки чтения с диска выглядят как повреждение данных. Отличить помогают записи ядра.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Подробные сообщения InnoDB о причине отказа.
sudo tail -80 /var/log/mysql/error.logСвободное место: частая причина повреждений.
df -h /var/lib/mysqlОшибки диска, объясняющие повреждение.
journalctl -k -b --no-pager | grep -i "I/O error"Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- InnoDB рассчитывает на корректную запись журнала. Отключение питания или зависание оставляют его в несогласованном состоянии.
- Как проверить
-
Посмотрите журнал ошибок.
sudo tail -60 /var/log/mysql/error.log | grep -iE "innodb|corrupt|crash"
- Как исправить
-
Восстановите из резервной копии. Если её нет, поднимите сервер в режиме восстановления (начиная с уровня 1), выгрузите данные и создайте базу заново.
sudo systemctl stop mysql # в my.cnf: innodb_force_recovery = 1 sudo systemctl start mysql && mysqldump --all-databases > /root/dump.sql
- Почему происходит
- Нехватка места прерывает запись журнала и табличных файлов. После освобождения места данные могут остаться несогласованными.
- Как проверить
-
Посмотрите свободное место и записи о нехватке.
df -h /var/lib/mysql sudo grep -i "no space" /var/log/mysql/error.log | tail
- Как исправить
- Освободите место, затем разбирайтесь с целостностью. Пока места нет, любые попытки запуска только усугубят состояние.
- Почему происходит
- Ошибки чтения с диска выглядят как повреждение данных. Отличить помогают записи ядра.
- Как проверить
-
Посмотрите записи ядра и состояние диска.
journalctl -k -b --no-pager | grep -iE "I/O error|medium error" | head sudo smartctl -H /dev/sda 2>/dev/null | head
- Как исправить
- Снимите копию данных на другой носитель и замените диск. Восстановление на умирающем диске бессмысленно.
Пример вывода
InnoDB обнаружил повреждение страницы. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
mysqld[5100]: [ERROR] [MY-012153] [InnoDB] Database page corruption on disk or a failed file read of page
mysqld[5100]: [ERROR] [MY-012154] [InnoDB] You may have to recover from a backup.
mysqld[5100]: [ERROR] [MY-013183] [InnoDB] Assertion failure: buf0buf.cc
systemd[1]: mysql.service: Main process exited, code=dumped, signal=ABRT
Связанные ошибки
- signal=ABRT (status=6/ABRT) в systemd Процесс службы завершён сигналом ABRT: программа сама прервала работу после внутренней проверки. Где искать причину.
- No space left on device в журнале службы Нет места на устройстве: разбор по свободным блокам, по inode, по журналу systemd и по удалённым, но открытым файлам.
- MySQL: Can't open the mysql.plugin table и повреждение системных таблиц MySQL не запускается: недоступны или повреждены системные таблицы. Права на каталог данных, версия схемы, восстановление.
- MySQL: журнал двоичных изменений заполнил диск Место кончилось из-за binlog: не настроена очистка, отстала репликация, слишком большой срок хранения.
- Redis: MISCONF Errors writing to the RDB snapshot Redis отказывается принимать запись: не удалось сохранить снимок на диск. Место, права, настройка overcommit.
- Disk quota exceeded для службы Место на разделе есть, а запись отклоняется: исчерпана дисковая квота пользователя или группы.
- Docker: no space left on device при запуске контейнеров Раздел с /var/lib/docker заполнен образами и слоями. Как посчитать занятое и что можно удалить безопасно.
- Elasticsearch: индексы переведены в режим только для чтения Elasticsearch блокирует запись при нехватке места: пороги watermark. Как снять блокировку правильно.
Где встречается чаще всего
Источники
- Документация MySQL: принудительное восстановление InnoDB
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Наблюдалось после отключения питания тестовой машины во время записи.