Spec-Zone.ru › MySQL 5.7

14.22.2 Принудительное восстановление InnoDB

Для исследования повреждения страниц базы данных вы можете экспортировать свои таблицы из базы данных с помощью SELECT ... INTO OUTFILE. Обычно большая часть данных, полученная таким способом, остается неповрежденной. Серьезное повреждение может привести к тому, что операторы SELECT * FROM tbl_name или фоновые операции InnoDB неожиданно завершатся или выдадут ошибку, или даже приведут к аварийному завершению процесса InnoDB восстановления. В таких случаях можно использовать опцию innodb_force_recovery, чтобы заставить движок хранения InnoDB начать работу, предотвратив выполнение фоновых операций, чтобы можно было экспортировать таблицы. Например, можно добавить следующую строку в раздел [mysqld] файла опций перед перезапуском сервера:

[mysqld]
innodb_force_recovery = 1

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

  • 6 (SRV_FORCE_NO_LOG_REDO)

    Не выполняет восстановления в связи с восстановлением. Это значение может привести к постоянному повреждению файлов данных. Оставляет страницы базы данных в устаревшем состоянии, что, в свою очередь, может привести к дальнейшему повреждению B-деревьев и других структур базы данных. Устанавливает InnoDB в режим только для чтения.

Можно SELECT из таблиц, чтобы экспортировать их. При значении innodb_force_recovery 3 или меньше можно DROP или CREATE таблицы. DROP TABLE также поддерживается при значении innodb_force_recovery больше 3, до MySQL 5.7.17. Начиная с MySQL 5.7.18, 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.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/forcing-innodb-recovery.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API