Ошибка "Table '...' is marked as crashed" в логах MySQL означает повреждение служебной структуры таблицы, обычно движка MyISAM, из-за некорректного завершения работы сервера или диска. Разберём, как это восстановить на сайте 1С-Битрикс, не потеряв данные.
Почему возникает эта ошибка
Повреждение таблицы чаще всего связано с внезапным завершением работы MySQL — аварийная перезагрузка сервера, заполнение диска до нуля свободного места во время операции записи, сбой файловой системы. Таблицы движка MyISAM (в отличие от InnoDB с его журналированием транзакций) более уязвимы к такому повреждению, поскольку не имеют встроенного механизма восстановления после некорректного завершения записи.
Первый шаг: определить, какая таблица повреждена
tail -100 /var/log/mysql/error.log | grep -i crashed
Лог ошибок MySQL обычно явно называет конкретную повреждённую таблицу — эта информация нужна для точечного восстановления, а не попытки проверить и восстановить все таблицы базы данных сразу, что заметно дольше на большой базе.
Нужна помощь с Битрикс?
Восстановление через REPAIR TABLE
mysql -u root -p
USE bitrix_db;
REPAIR TABLE b_iblock_element;
Команда REPAIR TABLE — стандартный способ восстановления
повреждённой таблицы MyISAM: MySQL пытается перестроить индексы
и структуру таблицы, сохраняя данные, где это возможно. Перед
выполнением на боевой базе обязательна резервная копия, поскольку
в редких случаях восстановление может не суметь вернуть все данные
без потерь, если повреждение оказалось слишком серьёзным.
Восстановление через консольную утилиту myisamchk
# остановить MySQL перед использованием myisamchk на файлах напрямую
systemctl stop mysql
myisamchk --recover /var/lib/mysql/bitrix_db/b_iblock_element.MYI
systemctl start mysql
Для случаев, когда REPAIR TABLE через SQL-интерфейс
не срабатывает (сам сервер MySQL не может даже открыть таблицу
для восстановления), консольная утилита myisamchk
работает напрямую с файлами таблицы на диске, но требует остановки
MySQL на время операции, что означает недоступность сайта
на этот период.
Проверка на исчерпание места на диске как первопричину
df -h
Если причиной повреждения стало заполнение диска до конца, восстановление таблицы без освобождения места на диске рискует привести к повторному повреждению в ближайшее время, — стоит сначала устранить первопричину (освободить место, настроить мониторинг заполнения диска), а не только восстановить симптом в виде конкретной повреждённой таблицы.
Миграция на InnoDB для устойчивости в будущем
ALTER TABLE b_iblock_element ENGINE=InnoDB;
Таблицы движка InnoDB значительно устойчивее к повреждению при аварийном завершении благодаря журналированию транзакций — для проекта, регулярно сталкивающегося с повреждением таблиц MyISAM, миграция критичных таблиц на InnoDB снижает риск повторения проблемы в будущем, хотя современные установки Битрикса по умолчанию уже используют InnoDB для большинства таблиц ядра.
Проверка целостности данных после восстановления
После успешного REPAIR TABLE стоит явно проверить,
что данные реально корректны — сверить количество записей
с ожидаемым (если есть представление о примерном объёме до сбоя)
и визуально проверить работу сайта в разделах, использующих
восстановленную таблицу, а не считать восстановление автоматически
полным без проверки на практике.
Частые ошибки
- Восстановление запущено без резервной копии. В редких случаях серьёзного повреждения часть данных может быть потеряна без возможности отката.
- Первопричина (заполненный диск) не устранена перед восстановлением. Риск повторного повреждения в ближайшее время после восстановления.
- Результат восстановления не проверен на практике. Формально успешный REPAIR TABLE не гарантирует полной сохранности всех данных без визуальной проверки.
Итог
Повреждённая таблица MySQL восстанавливается через
REPAIR TABLE или, в более серьёзных случаях,
через консольный myisamchk при остановленном сервере
MySQL, — но перед восстановлением обязательна резервная копия,
а после — проверка первопричины сбоя (часто заполнение диска),
которую нужно устранить, чтобы повреждение не повторилось в
ближайшее время.
