innodb force recovery

MySQL поддерживает два основных движка: MyISAM и InnoDB, InnoDB используется гораздо чаще. При серьезных проблемах в работе сервера — при нехватке оперативной памяти или закончившемся месте на диске таблицы сервера баз данных могут оказаться поврежденными. Таблицы MyISAM исправляются при помощи утилиты myisamchk, восстановление же InnoDB обычно занимает несколько больше времени. Рассмотрим как исправить таблицы InnoDB добавлением директивы innodb force recovery

 

innodb force recovery и восстановление Mysql из дампа

mcedit /etc/mysql/my.cnf

 

[mysqld]
innodb_force_recovery = 1

 

Параметру innodb_force_recovery ставится в соответствие числовое значение от 1 до 6. С увеличением значения MySQL становится менее чувствителен к целостности таблиц и запускается. Именно за счет директивы сервер баз данных становится возможным запустить.

 

Если в логах сервера баз данных встречаются такие сообщения:

InnoDB: Waiting for the background threads to start

 

В конфигурационный файл необходимо также добавить

innodb_purge_threads=0

 

Также лучше сменить порт, на котором работает MySQL

port = 3307

 

Все три параметра добавляются в /etc/mysql/my.cnf

 

Сейчас MySQL запущен, но в режиме восстановления в котором изменять таблицы нельзя. Выясним какие таблицы повреждены и сделаем дамп.

Проверяем таблицы и ищем Corrupted

mysqlcheck —all-databases

 

Делаем дамп всех поврежденных таблиц (составляем их список если таблиц много):

mysqldump database_name table_name > database.table.sql

 

Затем удаляем:

drop table database.table;

В режиме восстановления мы сделали дампы, которые загрузим в MySQL когда он будет запущен в нормальном режиме.

 

Снова заходим в /etc/mysql/my.cnf и удаляем директивы innodb_purge_threads=0 и innodb_force_recovery = 1.

 

Перезапускаем MySQL

/etc/init.d/mysql restart

 

Теперь можно загрузить поврежденные ранее таблицы, дампы которых сделали ранее в режиме восстановления.

mysql database < database.table.sql

 

В /etc/mysql/my.cnf меняем порт на тот, на котором сервер баз данных работал ранее. и перезапускаем вновь

/etc/init.d/mysql restart

 

После того как все описанные шаги проделаны MySQL должен вновь работать нормально, а все таблицы InnoDB будут исправлены.