Очень много движков сайтов и сервисов использует для хранения информации базы данных и наиболее популярной, на мой взгляд, считается 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 <таблица>, так как более сложные запросы могут окончательно повредить данные. Следите за своими данными, делайте резервные копии регулярно.