Spec-Zone.ru › MySQL 8.4

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

Для исследования повреждения страниц базы данных вы можете экспортировать таблицы из базы данных с помощью SELECT ... INTO OUTFILE. Обычно большая часть данных, полученных таким образом, остается не поврежденной. Серьезное повреждение может привести к тому, что SELECT * FROM tbl_name операторы или InnoDB фоновые операции неожиданно завершатся или вызовут ошибку, или даже приведут к тому, что 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.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/forcing-innodb-recovery.html

Spec-Zone.ru

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