Восстановление повреждённого InnoDB

MySQL

Автор: Eugen

1 нояб. 2011 г., 10:45:11  1201


Всем доброй ночи...
Сразу — кто не хочет читать всё — смотрим на выделенный цветом текст...
Давно уже не писал ничего здесь, наконец, подвернулся неудачный случай...
Лежал мой сервер на шкафу несколько месяцев, не запускался вообще ниразу. На кануне, перед тем, как он там оказался, система (FreeBSD 6.4) не была корректно выключена — слишком долго не было электричества, бесперебойник сел и… После этого я сервер запустил, проверил, что система вообще загружается и всё — забил, если можно так сказать :( Электричество у нас подорожало, сервер я больше не могу держать, вместе со своим сайтом с веб-инструментами.

Вчера возникла необходимость скопировать некоторые данные с сервера, а заодно, показать одному человеку свой сайт. Взял сервер, подключил, включаю — не запускается, пищит. В конечном итоге запустился после передёргивания всех устройств — неконтакт был где-то. Загружается система, я в браузер, набираю заветный IP — ошибка базы данных. Смотрю логи — MySQL не запустился, повреждён InnoDB.
Прогонял fsck — проверил файловую систему, исправило несколько ошибок, ребут, лог… то же самое. mysqlcheck, естественно, не запускается — ведь MySQL сервер-то не запущен. Интернета дома в этот момент не было, ноутбук с модемом я оставил там, где отдыхал (откуда вернулся в город на пересменку), начал изучение мануалов. Пробовал всё что только можно, и форсированный запуск (с игнорированием ошибок) — ноль на массу. Удалять InnoDB нельзя — там несколько нужных таблиц (которые, в т.ч., мне и скопировать нужно было оттуда).

Длительное время изучения мануалов привело к обнаружению весьма интересного параметра конфигурации MySQL — innodb_force_recovery.Просто необходимо добавить строку:
в файл конфигурации MySQL, запустить его один раз, после чего можно и убрать эту строку… Где-то с полчаса сервер подумал, после чего написал в лог, что всё восстановлено и благополучно запустился. Всё заработало, всё скопировал, что нужно было. Ура!

Выводы делаем отсюда такие: 

innodb_force_recovery = 1

1. Обязательно делаем регулярные бэкапы, желательно, на отдельные носители, которые хранятся не подключенными
2. Стараемся недопускать некорректных завершений работы системы (причём, любой)
3. Железо очень не любит лежать без работы. Может и не запуститься потом, уже не раз такое бывало. Причём, мне, как радиолюбителю и человеку, понимающему, что как работает, всё равно не до конца ясно, почему это так.

С вами был Eugen. 73! de UW5EAF :)
P.S. Гибсон, привет. Давно не общались…