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.