Восстановление базы данных InnoDB
Каждый администратор баз данных боится этого момента: сервис MySQL не запускается, а в логах появляются пугающие сообщения о повреждении таблиц InnoDB. Это может случиться из-за сбоя питания, нехватки места на диске или ошибок в самом оборудовании.
К счастью, у InnoDB есть встроенный механизм аварийного восстановления — параметр innodb_force_recovery. Это мощный, но опасный инструмент, который может спасти ваши данные, когда ничего другое не помогает. Это ваше последнее средство.
- Использование innodb_force_recovery может привести к потере части данных. Цель этой процедуры — запустить базу данных в аварийном режиме, чтобы извлечь из нее максимум уцелевшей информации.
- НИКОГДА не выполняйте эти действия на "живых" данных! Прежде чем начать, обязательно сделайте полную копию вашей директории с базами данных (например, /var/lib/mysql).
Шаг 1: Диагностика проблемы
Первый шаг — убедиться, что проблема именно в повреждении данных. Для этого нужно заглянуть в лог ошибок MySQL. Его стандартное расположение:
/var/log/mysql/error.log
/var/log/mysqld.log
Остановите сервис MySQL (sudo service mysql stop
) и изучите последние записи в
логе.
Если вы видите сообщения, похожие на эти, значит, вы на верном пути:
Лог:
InnoDB: Database page corruption on disk or a failed
InnoDB: file read of page [page no].
...
InnoDB: Trying to get some variables.
InnoDB: Next log sequence number [number]
InnoDB: Last checkpoint at [number]
...
InnoDB: Corruption of an index tree: table `database`.`table`
InnoDB: index `PRIMARY` page [page number]
Шаг 2: Создание резервной копии
Еще раз: этот шаг — самый важный. Не пропускайте его. Убедитесь, что сервис MySQL остановлен, и создайте полную копию директории с данными.
sudo cp -a /var/lib/mysql /var/lib/mysql_backup
Теперь, если что-то пойдет не так, у вас будет исходная точка для новой попытки.
Шаг 3: Запуск в режиме innodb_force_recovery
Теперь мы попытаемся запустить MySQL в специальном режиме.
- Откройте конфигурационный файл MySQL. Обычно он находится по одному из этих путей:
code.language-bash/etc/mysql/my.cnf
или/etc/my.cnf.d/server.cnf
. -
Найдите секцию [mysqld] и добавьте в нее следующую строку:
innodb_force_recovery = 1
Что означают уровни innodb_force_recovery?
Значение этого параметра можно изменять от 1 до 6. Каждый следующий уровень включает в себя все проверки предыдущих и добавляет новые, более "радикальные" допущения. Начинать нужно всегда с 1 и повышать на единицу, только если сервер не запустился с предыдущим значением.
- (рекомендуется для старта): Позволяет серверу запуститься, даже если он обнаружит поврежденную страницу. Пытается заставить SELECT * работать, пропуская поврежденные записи.
- Не запускает фоновые операции InnoDB (например, очистку).
- Не пытается откатывать незавершенные транзакции.
- Отключает все операции модификации InnoDB. База данных становится полностью read-only (только для чтения).
- Не считывает логи отката (undo logs) при запуске. InnoDB будет считать незавершенные транзакции завершенными.
- Не выполняет накат логов (redo logs) при запуске.
После добавления строки сохраните файл и попробуйте запустить MySQL:
sudo service mysql start
.
Если не получилось, увеличьте значение (= 2, = 3 и т.д.) и пробуйте снова.
Чаще всего удается запуститься на уровнях 1-3.
Шаг 4: Экспорт данных (создание дампа)
Если сервис запустился (даже с innodb_force_recovery = 4), ваша главная задача — немедленно "эвакуировать" все данные в безопасное место. Лучший способ для этого — mysqldump.
mysqldump -u root -p --all-databases > /root/emergency_dump.sql
Этот процесс может занять много времени и выдать ошибки на некоторых таблицах, которые повреждены слишком сильно. Это нормально. Наша цель — спасти все, что можно спасти.
Шаг 5: Полное пересоздание базы данных
После того как дамп создан, можно приступать к финальному этапу — полному "обнулению" и восстановлению.
- Остановите MySQL:
sudo service mysql stop
- Очень важно: закомментируйте или удалите строку innodb_force_recovery из my.cnf.
- Внимание, деструктивная команда! Полностью очистите директорию с данными:
sudo rm -rf /var/lib/mysql/*
- Переинициализируйте базу данных (команда может отличаться в старых системах):
sudo mysqld --initialize-insecure --user=mysql
- Запустите сервис, установите новый пароль для root.
- Восстановите данные из дампа:
mysql -u root -p < /root/emergency_dump.sql
Заключение
Процедура аварийного восстановления — это сложная и рискованная операция, требующая концентрации. Она может спасти ваш проект, но лучший способ справиться с такими ситуациями — не допускать их. Ничто не заменит регулярные, настроенные и, самое главное, проверяемые резервные копии.
Оставить комментарий