Исправляем поврежденные INNODB таблицы

Исправляем поврежденные 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:

  1. Mode 1 — не «отваливается» MySQL, когда он видит коррумпированные страницы.
  2. Mode 2 — не запускает фоновые операции.
  3. Mode 3 — Не пытается откатить транзакции.
  4. Mode 4 —  не рассчитывает статистику или не применяет сохраненные/буферизированные изменения.
  5. Mode 5 —  Не смотрите на log-и отката при запуске.
  6. 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 таблиц, поделитесь.

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.