Что было. Сервер с веб-приложением и MySQL выключили принудительно. После загрузки база не стартует; в журнале ошибок [ERROR] [InnoDB] Cannot resize redo log file … Write to file failed at offset 0, 0 bytes written, Error number 28 means 'No space left on device', и дальше отказ инициализации InnoDB. При этом администратор сначала не связал сообщение с диском.
Почему. Код 28 это ENOSPC, нет места на устройстве. При старте InnoDB создаёт или расширяет журналы повтора; для этого нужны сотни мегабайт свободного места на разделе с каталогом данных. Место кончилось ещё до выключения (в обсуждении раздел был заполнен), и аварийное выключение лишь сделало проблему видимой. Автор освободил место (удаление ненужных пакетов и данных, перенос части каталогов), после чего база поднялась; для части работ понадобился chroot с загрузочного носителя. Подтверждено.
Правильный порядок.
df -hиdf -iдля раздела с/var/lib/mysql(и для/tmp, который MySQL использует для временных таблиц). Если занято 100 %, дальше ничего не запускать до освобождения хотя бы нескольких гигабайт.- Что освобождать безопасно:
journalctl --vacuum-size=200M,apt clean, старые ядра (apt autoremove), архивы в/var/log, ротация логов приложения, кэш пакетов и сборок. Что не трогать: файлыib_logfile*,ibdata1,binlog.*руками; бинарные журналы чистить только командойPURGE BINARY LOGSиз работающего сервера или черезbinlog_expire_logs_seconds. - Запустить MySQL, проверить
journalctl -u mysql -b, затемmysqlcheck --all-databases. - Если сервер поднялся, но данные повреждены (отдельные таблицы не открываются): режимы принудительного восстановления и дамп (отдельный разбор).
Почему база страдает первой. Она пишет постоянно (журналы повтора, бинарные журналы, временные таблицы) и честно останавливается при отказе записи; веб-сервер и системные службы часто продолжают работать «как-то». Поэтому «сайт открывается, а база упала» типичная картина переполненного диска.
Профилактика.
- Каталог данных на отдельном разделе или томе с запасом; мониторинг с порогом 85 % и оповещением.
binlog_expire_logs_seconds(по умолчанию 30 дней) под реальный объём; на небольших серверах без репликации бинарные журналы можно отключить (skip-log-bin) или хранить 3–7 дней.- Регулярные дампы с хранением на другом диске: они же спасают, если восстановление не удалось.
- Не выключать сервер принудительно при «зависании»: сначала
systemctl stop mysqlчерез консоль, дождаться, потом перезагрузка.
Поведение при заполненном диске описано в документации MySQL.