17.20.3 Принудительное восстановление InnoDB
Для исследования повреждения страниц базы данных вы можете выполнить дамп своих таблиц из базы данных с помощью SELECT ... INTO
OUTFILE. Обычно большая часть данных, полученных таким образом, остается нетронутой. Серьёзные повреждения могут привести к неожиданному завершению или утверждению операторов SELECT * FROM
или фоновых операций tbl_nameInnoDB, а также к сбою восстановления InnoDB. В таких случаях вы можете использовать параметр innodb_force_recovery, чтобы принудительно запустить движок хранения InnoDB, предотвратив выполнение фоновых операций, для того чтобы выполнить дамп своих таблиц. Например, вы можете добавить следующую строку в раздел [mysqld] вашего файла параметров перед перезапуском сервера:
[mysqld]
innodb_force_recovery = 1
Сведения об использовании файлов параметров см. в разделе 6.2.2.2, «Использование файлов параметров».
Устанавливайте innodb_force_recovery только в экстренных ситуациях на значение, большее 0, чтобы вы могли запустить InnoDB и выполнить дамп своих таблиц. Перед этим убедитесь, что у вас есть резервная копия вашей базы данных на случай необходимости её восстановления. Значения 4 или больше могут привести к постоянному повреждению файлов данных. Используйте значение innodb_force_recovery 4 или больше только на экземпляре сервера в рабочей среде после успешного тестирования параметра на отдельной физической копии вашей базы данных. При принудительном восстановлении InnoDB всегда начинайте с innodb_force_recovery=1 и увеличивайте значение постепенно по мере необходимости.
innodb_force_recovery по умолчанию равно 0 (обычный запуск без принудительного восстановления). Допустимые ненулевые значения для innodb_force_recovery находятся в диапазоне от 1 до 6. Более высокое значение включает функциональность меньших значений. Например, значение 3 включает всю функциональность значений 1 и 2.
Если вы можете выполнить дамп своих таблиц со значением innodb_force_recovery 3 или меньше, то вы можете быть относительно уверены, что потеряны только некоторые данные на повреждённых отдельных страницах. Значение 4 или больше считается опасным, так как может привести к постоянному повреждению файлов данных. Значение 6 считается радикальным, так как страницы базы данных остаются в устаревшем состоянии, что, в свою очередь, может привести к дальнейшему повреждению B-деревьев и других структур базы данных.
В качестве меры предосторожности InnoDB предотвращает операции INSERT, UPDATE или DELETE, когда значение innodb_force_recovery больше 0. Значение innodb_force_recovery 4 или больше помещает InnoDB в режим только для чтения.
-
1(SRV_FORCE_IGNORE_CORRUPT)Позволяет серверу работать даже при обнаружении повреждённых файлов . Позволяет обойти повреждённые записи и страницы индексов, что помогает при дампе таблиц.
-
2(SRV_FORCE_NO_BACKGROUND)Предотвращает выполнение и любых . Если во время произойдёт неожиданное завершение, это значение предотвратит это.
-
3(SRV_FORCE_NO_TRX_UNDO)Не выполняет операцию транзакции после .
-
4(SRV_FORCE_NO_IBUF_MERGE)Предотвращает операции слияния . Если они приведут к сбою, они не выполняются. Не вычисляет таблицы. Это значение может привести к постоянному повреждению файлов данных. После использования этого значения будьте готовы удалить и воссоздать все вторичные индексы. Устанавливает
InnoDBв режим только для чтения. -
5(SRV_FORCE_NO_UNDO_LOG_SCAN)Не проверяет при запуске базы данных:
InnoDBобрабатывает даже неполные транзакции как завершённые. Это значение может привести к постоянному повреждению файлов данных. УстанавливаетInnoDBв режим только для чтения. -
6(SRV_FORCE_NO_LOG_REDO)Не выполняет восстановление в связи с восстановлением. Это значение может привести к постоянному повреждению файлов данных. Оставляет страницы базы данных в устаревшем состоянии, что, в свою очередь, может привести к дальнейшему повреждению B-деревьев и других структур базы данных. Устанавливает
InnoDBв режим только для чтения.
Вы можете SELECT из таблиц, чтобы выполнить их дамп. Со значением innodb_force_recovery 3 или меньше вы можете выполнить DROP или CREATE таблицы. DROP
TABLE также поддерживается со значением innodb_force_recovery больше 3. DROP TABLE не разрешено со значением innodb_force_recovery больше 4.
Если известно, что определённая таблица вызывает неожиданное завершение при отмене, её можно удалить. Если вы столкнулись с бесконечной отменой, вызванной сбоем массового импорта или ALTER
TABLE, вы можете убить процесс mysqld и установить innodb_force_recovery на 3, чтобы запустить базу данных без отмены, а затем DROP таблицу, вызывающую бесконечную отмену.
Если повреждение данных в таблице препятствует выполнению дампа всего содержимого таблицы, запрос с клаузой ORDER BY
может помочь выполнить дамп части таблицы после повреждённой части. primary_key DESC
Если для запуска InnoDB требуется высокое значение innodb_force_recovery, могут быть повреждённые структуры данных, которые могут привести к сбоям сложных запросов (запросов, содержащих WHERE, ORDER
BY или другие клаузы). В этом случае вы сможете выполнить только базовые SELECT * FROM t запросы.
© 2025 Oracle
Licensed under the GPLv2 License.