Восстановление баз данных MySQL на движке InnoDB
20 Май 2012, 16:10
Для тех, у кого поломалась база Mysql на движке InnoDB и вы обнаружили у себя в логах подобные сообщения, а бекапа как назло нет или есть, но неактуальный, ниже рассписано по-шагам, что сделать, чтобы вернуть базе работоспособность, ну или хотя бы возможность номально вытащить часть данных (все зависит от степени повреждения).
Sep 27 00:51:58 mysqld[3609]: 110927 0:51:58 InnoDB: Error: page 3233 log sequence number 0 1547883048
Sep 27 00:51:58 mysqld[3609]: InnoDB: is in the future! Current system log sequence number 0 483285360.
Sep 27 00:51:58 mysqld[3609]: InnoDB: Your database may be corrupt or you may have copied the InnoDB
Sep 27 00:51:58 mysqld[3609]: InnoDB: tablespace but not the InnoDB log files. See
Sep 27 00:51:58 mysqld[3609]: InnoDB: http://dev.mysql.com/doc/refman/5.0/en/ ... overy.html
Sep 27 00:51:58 mysqld[3609]: InnoDB: for more information.
Отличительная черта InnoDB в отличии от того же например MyIsam - его не рушимость. Но и у этой медали есть обратная сторона - базы на этом движке не так легко и починить, по крайней мере, штатными средствами.
Итак, что делать?
1. Открываем действующий my.cnf и в секцию [mysqld] добавляем строчку: innodb_force_recovery = 4
2. Перезагружаем mysql и видим, что он успешно запустился.
3. Делаем дамп всех наших баз:
mysqldump -u root -p --all-databases > /home/full_dump.sql
4. Как только дамп будет сделан, выключаем сервис MySQL
5. Находим, где физически на диске у нас находятся базы данных и удаляем все, что там есть. Как правило файлы баз данных располагаются в папке /var/lib/mysql
6. Из my.cnf уберите строчку innodb_force_recovery = 4
7. Выполните mysql_install_db, чтобы сделать первоначальную установку баз с нуля
8. Восстановите бекап из нашего дампа: mysql -u root -p < /home/full_dump.sql
9. Перезапустите сервис mysql
Готово, теперь данные доступны для обработки, а если ошибки были незначительные, то с ними можно будет и продолжать работать без правок)
P.S.: Не забывайте делать бекапы и по-чаще