Восстановление базы INNODB
Рассмотрим неприятную ситуация, когда вследствие отключения сервера по питанию, была поломана база Mysql с таблицами InnoDB. Это может произойти, например, в случае отключения сервера по питанию или некорректного завершения процесса mysql с вылетом в OOM.
В логах при попытке запуска появляются такие сообщения:
mysqld[10332]:InnoDB:Database page corruption on disk or a failed mysqld[10332]:InnoDB: file read of page 419. mysqld[10332]:InnoDB:You may have to recover from a backup. mysqld[10332]:InnoDB:Itis also possible that your operating mysqld[10332]:InnoDB: system has corrupted its own file cache mysqld[10332]:InnoDB:and rebooting your computer removes the mysqld[10332]:InnoDB: error.
База не запускается. Пробуем сделать дамп базы и смотрим на какой таблице запнулись. Когда дамп пройдет без ошибок, это означает успех.
Ремонт:
В /etc/mysql/my.cnf устанавливаем innodb_force_recovery=3 и запускаем Mysql. В данном режиме нам предоставилась возможность запустить Innodb, но делать с ней практически ничего нельзя. Все сервисы следует остановить, база должна быть максимально свободна.
Создаем рядом такую же таблицу только в формате MyISAM.
create table table_tmp LIKE table
Перегоняем из старой таблицы в новую все что возможно вытащить. Интервалы подбираем так, чтобы сохранить данные.
insert ignore into table_tmp SELECT *from table where id>=185000and id<187000;
Как только сохранили все что возможно, дропаем table. Если не получается обычным дропом, пробуем сдампить базу без таблицы и попробовать дропнуть базу. Если не получается и так, удаляем frm-файл и стартуем сервис.
После восстановления и успешного дампа убираем строчку в my.cnf и продолжаем работу в штатном режиме.