Восстановление базы данных 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 в специальном режиме.

  1. Откройте конфигурационный файл MySQL. Обычно он находится по одному из этих путей: code.language-bash/etc/mysql/my.cnf или /etc/my.cnf.d/server.cnf.
  2. Найдите секцию [mysqld] и добавьте в нее следующую строку:
    innodb_force_recovery = 1

Что означают уровни innodb_force_recovery?

Значение этого параметра можно изменять от 1 до 6. Каждый следующий уровень включает в себя все проверки предыдущих и добавляет новые, более "радикальные" допущения. Начинать нужно всегда с 1 и повышать на единицу, только если сервер не запустился с предыдущим значением.

  1. (рекомендуется для старта): Позволяет серверу запуститься, даже если он обнаружит поврежденную страницу. Пытается заставить SELECT * работать, пропуская поврежденные записи.
  2. Не запускает фоновые операции InnoDB (например, очистку).
  3. Не пытается откатывать незавершенные транзакции.
  4. Отключает все операции модификации InnoDB. База данных становится полностью read-only (только для чтения).
  5. Не считывает логи отката (undo logs) при запуске. InnoDB будет считать незавершенные транзакции завершенными.
  6. Не выполняет накат логов (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: Полное пересоздание базы данных

После того как дамп создан, можно приступать к финальному этапу — полному "обнулению" и восстановлению.

  1. Остановите MySQL:
    sudo service mysql stop
  2. Очень важно: закомментируйте или удалите строку innodb_force_recovery из my.cnf.
  3. Внимание, деструктивная команда! Полностью очистите директорию с данными:
    sudo rm -rf /var/lib/mysql/*
  4. Переинициализируйте базу данных (команда может отличаться в старых системах):
    sudo mysqld --initialize-insecure --user=mysql
  5. Запустите сервис, установите новый пароль для root.
  6. Восстановите данные из дампа:
    mysql -u root -p < /root/emergency_dump.sql

Заключение

Процедура аварийного восстановления — это сложная и рискованная операция, требующая концентрации. Она может спасти ваш проект, но лучший способ справиться с такими ситуациями — не допускать их. Ничто не заменит регулярные, настроенные и, самое главное, проверяемые резервные копии.

Оставить комментарий