Исправляем поврежденные INNODB таблицы
Таблицы InnoDB наиболее популярны на сегодняшний день т.к они поддерживают транзакции, они надежны в отличие от MyISAM и InnoDB поддерживает одновременные записывание в ту же таблицу.
Внутренний механизм восстановления InnoDB является довольно хорошим. Если вы имеете сбой базы данных, InnoDB будет пытаться исправить все, запустив лог-файл можно посмотреть последнюю метку и время когда это случилось. В большинстве случаев — вас ждет успех и весь процесс является прозрачным.
К сожалению, если не удается InnoDB восстановить себя, -entire- база данных не запустяться. MySQL завершится с сообщением об ошибке и вся ваша база данных будет находиться в автономном режиме. Вы можете попробовать перезапустить базу данных снова и снова, но если процесс ремонта не удается — база данных будет падать и будет переставать запускаться.
Это одна из причин, почему вы всегда должны запустить настройки master/master при использовании InnoDB т.к есть всегда избыточный мастер, если не удается запустить 1-й.
Если у вас есть коррумпированные таблицы InnoDB, которые мешают вашей базы данных работать хорошо, вы должны следовать моим инструкциям. В своей теме «Исправляем поврежденные INNODB таблицы» я все покажу как можно легко исправить данную проблему и восстановить в рабочее состояние все базы данных.
Шаг 1.
Добавьте следующую строку в ваш конфигурационный файл /etc/my.cnf:
# vim /etc/my.cnf
и вставляем следующую строчку:
[mysqld] innodb_force_recovery = 4
Примечание: Если MySQL не запускается, продолжать увеличивать количество innodb_force_recovery, пока вы не получите innodb_force_recovery = 8. Хотя, в основном, доходит до 6:
- Mode 1 — не «отваливается» MySQL, когда он видит коррумпированные страницы.
- Mode 2 — не запускает фоновые операции.
- Mode 3 — Не пытается откатить транзакции.
- Mode 4 — не рассчитывает статистику или не применяет сохраненные/буферизированные изменения.
- Mode 5 — Не смотрите на log-и отката при запуске.
- Mode 6 — Не прокрутки вперед от повтора логов (ib_logfiles) во время пуска.
Так например, если ваш сервер MySQL запускается в режиме 3, но не режим 2, это может быть предположение что «авария» возникла с процессом отката транзакций. Кроме того, следует знать, что режимы 4-6 mysql будет работать в режиме только для чтения.
Я использую 4. Помогает в 99%.
Вы также можете запустить следующую команду чтобы добавить данную опцию в файл /etc/my.cnf автоматически (изменить цифру в поле «mode=»):
# mode=4; sed -i "/^\[mysqld\]/{N;s/$/\ninnodb_force_recovery=$mode/}" /etc/my.cnf
Затем, после восстановления поврежденных баз, нужно убрать опцию (вернуть обратно в режим по умолчанию), то вы можете удалить innodb_force_recovery строку с помощью следующей команды:
# sed -i '/innodb_force_recovery/d' /etc/my.cnf
О sed, я надеюсь расскажу еще, но попозже.
Шаг 2.
Перезагрузите MySQL:
# service mysql restart
или
# service mysqld restart
Можно и так:
# /usr/local/bin/mysqld_safe &
База данных теперь будет запускаться, но с параметром innodb_force_recovery,все INSERT-ы и UPDATE-ы будут игнорироваться.
Шаг 3.
Стоит позаботится о бекапах всех таблиц (создать дамп):
# mysqldump --force --compress --triggers --routines --create-options -uUSER_NAME -pUN_PASSWORD --all-databases > /usr/alldb.sql
Шаг 4.
Выключите сервер базы данных и удалите каталог данных. Запустите «mysql_install_db» для создания таблиц MySQL по умолчанию.
# rm -fdr /usr/local/var
Перезапускаем:
# mysqladmin -uUSER_NAME -pUN_PASSWORD shutdown
Шаг 5.
Снимите опцию «innodb_force_recovery» в /etc/my.cnf файл и перезапустите сервер баз данных:
# /usr/local/bin/mysqld_safe &
Шаг 6.
Восстановить все из резервной копии.
Повторное создание каталогов базы данных и так же установим основные таблицы в MySQL:
# mkdir /usr/local/var # chown -R mysql:mysql /usr/local/var # /usr/local/bin/mysql_install_db # chown -R mysql:mysql /usr/local/var
Импортировать все данные обратно (следующая команда может занять много времени, чтобы завершить все и восстановить все данные):
# mysql -uroot --compress < /usr/alldb.sql
И, наконец, — обновим привилегии MySQL (потому что мы также обновили таблицы MySQL):
# /usr/local/bin/mysqladmin -uroot flush-privileges
Примечание: Для получения наилучших результатов, добавьте «port=8819» (или любой другой из случайных чисел) в /etc/my.cnf перед перезапуском MySQL, а затем запустить «mysqldump» с параметром «—port = 8819».
Если все что выше, не помогло, то стоит попытаться использовать Mysqlcheck:
Восстановить все базы:
# mysqlcheck --all-databases -r
Проанализировать все базы:
# mysqlcheck --all-databases -a
Оптимизировать все базы:
# mysqlcheck --all-databases -o
Восстанавливаем одну базу:
# mysqlcheck -ro database_name
Восстанавливаем один столбец в базе:
# mysqlcheck -ro database_name table_name
Статья «Исправляем поврежденные INNODB таблицы» подошла к завершению. Если есть еще какие-либо соображения по восстановлению поврежденных INNODB таблиц, поделитесь.