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 будут исправлены.