Что делать если повредилась база данных MySQL

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

Для предотвращения потери информации следует делать регулярные резервные копии, но что делать если таблица повредилась в следствии программного или аппаратного сбоя, или аварийного завершения сервиса MySQL в силу каких-либо причин?

В случае с таблицами в формате MYISAM, все может решиться очень просто с помощью phpmyadmin (как указано на скриншоте), или из консоли терминала:

mysqlcheck -u<user> -p<pass> --repair

С форматом InnoDB все будет несколько сложней. Изначально, этот формат был разработан с расчетом на то, что он будет самостоятельно восстанавливать поврежденные таблицы. Но бывают моменты, когда повреждение может оказаться серьезным и повлиять на работоспособность всего сервера баз данных MySQL.

На этот случай была создана функция восстановления информации, которая включается параметром innodb_force_recovery в конфигурационном файле MySQL. Файл может находиться в /etc/my.cnf или /etc/mysql/my.cnf при использовании Linux.

По умолчанию, этот параметр выключен и пользоваться им нужно крайне осторожно, так как существует риск потерять все данные безвозвратно. Параметр добавляется в раздел ‘[mysqld]’

[mysqld]
innodb_force_recovery = 1

Значения параметра могут изменяться от 0 (выключено) до 6. И для его применения сервер MYSQL требуется перезапустить.

Обратите внимание, что значение параметра innodb_force_recovery выше “0” нужно изменять только в крайнем случае и только при восстановительных работах с таблицами базы данных. Ниже рассмотрим значения параметра, что они означают и для каких целей их следует применять.

Как я сказал выше, значение параметра выше 0 включать только для работ по восстановлению данных и только при наличии резервных копий текущих данных (к примеру, его можно выполнить при незапущенном MySQL простым копированием директории с бинарными данными (в Linux они расположены здесь: /var/lib/mysql). Значение от 4 и выше на “боевом” сервере лучше использовать только тогда, когда будете точно уверены в том, что сделали резервную копию данных и используя их восстановить все к исходной точке.

Когда решите воспользоваться параметром innodb_force_recovery, рекомендуется начать с 1 и постепенно увеличивать, если потребуется. С увеличением значения, добавляются различные параметры, которые необходимы для доступа к данным. К примеру, значение 3 включает в себя параметры, которые применялись при включении значения 1 и 2.

Так же напоминаю, что при проведении работ, не должно никаких операций с функциями INSERT, UPDATE или DELETE, т.е доступ к базе должен быть только на чтение и только для администратора.

Список значений параметра innodb_force_recovery:

1 (SRV_FORCE_IGNORE_CORRUPT)

Позволяет серверу запуститься даже в случае повреждения данных в innodb. После запуска попробуйте сделать выборку из таблицы - SELECT * FROM <таблица>.

2 (SRV_FORCE_NO_BACKGROUND)

Предотвращает работу основного треда. Если сбой возник в процессе очистки, этот параметр запретит ее повторный запуск

3 (SRV_FORCE_NO_TRX_UNDO)

Не позволяет выполнять транзакции отката после восстановления повреждений

4 (SRV_FORCE_NO_IBUF_MERGE)

Предотвращает операции объединения буферов, создающиеся при INSERT.Так же не отключается подсчет статистики. Это значение параметра innodb_force_recovery может окончательно повредить данные. После ее использования следует выполнить очистку и пересоздания всех второстепенных индексов.

5 (SRV_FORCE_NO_UNDO_LOG_SCAN)

Не обращает внимания на логи, в которых хранятся копии незавершенных транзакции, при запуске сервера. Это значение параметра innodb_force_recovery может окончательно повредить данные.

6 (SRV_FORCE_NO_LOG_REDO)

Не производится откат из незавершенных транзакций. Это значение параметра innodb_force_recovery может окончательно повредить данные.

После того, как значение параметра выставлено, можно делать как SELECT из таблиц, чтобы сдампить данные, либо DROP/CREATE для пересоздания таблиц. При установке значения “6”, настоятельно рекомендуется использовать только простейшие функции типа SELECT * FROM <таблица>, так как более сложные запросы могут окончательно повредить данные. Следите за своими данными, делайте резервные копии регулярно.

Автор статьи:

Сабынич Вадим

Аватар пользователя vadim s. sabinich
Вернуться