17.18.2 Восстановление InnoDB
В этом разделе описывается восстановление InnoDB. Тематика включает:
Восстановление в определённый момент времени
Чтобы восстановить базу данных InnoDB до текущего состояния с момента создания физической резервной копии, необходимо запустить сервер MySQL с включённым бинарным протоколированием, даже перед созданием резервной копии. Для достижения восстановления в определённый момент времени после восстановления резервной копии можно применить изменения из бинарного журнала, произошедшие после создания резервной копии. См. Раздел 9.5, «Восстановление в определённый момент времени (инкрементальное)».
Восстановление после повреждения данных или сбоя диска
Если ваша база данных повреждена или произошёл сбой диска, необходимо выполнить восстановление с помощью резервной копии. В случае повреждения, сначала найдите резервную копию, которая не повреждена. После восстановления основной резервной копии выполните восстановление в определённый момент времени из файлов бинарного журнала, используя mysqlbinlog и mysql для восстановления изменений, произошедших после создания резервной копии.
В некоторых случаях повреждения базы данных достаточно выполнить дамп, удалить и пересоздать одну или несколько повреждённых таблиц. Вы можете использовать оператор CHECK TABLE, чтобы проверить, повреждена ли таблица, хотя CHECK
TABLE естественно, не может обнаружить все возможные виды повреждений.
В некоторых случаях, явные повреждения страниц базы данных на самом деле вызваны повреждением операционной системой своего кэша файлов, а данные на диске могут быть в порядке. Лучше всего сначала перезагрузить компьютер. Это может устранить ошибки, которые казались повреждением страниц базы данных. Если MySQL по-прежнему испытывает проблемы с запуском из-за InnoDB проблем согласованности, см. Раздел 17.20.3, «Принудительное восстановление InnoDB», чтобы узнать, как запустить экземпляр в режиме восстановления, что позволяет вам сделать дамп данных.
Восстановление InnoDB после сбоя
Для восстановления после неожиданного завершения работы сервера MySQL необходимо только перезапустить сервер MySQL. InnoDB автоматически проверяет журналы и выполняет прокрутку базы данных до текущего состояния. InnoDB автоматически откатывает несохранённые транзакции, существовавшие в момент сбоя.
InnoDB состоит из нескольких этапов:
-
Обнаружение табличных пространств
Обнаружение табличных пространств — это процесс, который
InnoDBиспользует для определения табличных пространств, требующих применения журнала обратной записи. См. Обнаружение табличного пространства во время восстановления после сбоя. -
Применение журнала обратной записи
Применение журнала обратной записи выполняется во время инициализации, до принятия любых подключений. Если все изменения сброшены из в (
ibdata*и*.ibdфайлы) в момент завершения работы или сбоя, применение журнала обратной записи пропускается.InnoDBтакже пропускает применение журнала обратной записи, если файлы журнала обратной записи отсутствуют при запуске.-
Текущее максимальное значение счётчика автоинкремента записывается в журнал обратной записи каждый раз, когда значение изменяется, что делает его безопасным при сбоях. Во время восстановления
InnoDBпросматривает журнал обратной записи, чтобы собрать изменения значения счётчика и применить изменения к объекту таблицы в памяти.Для получения дополнительной информации о том, как
InnoDBобрабатывает значения автоинкремента, см. Раздел 17.6.1.6, «Обработка AUTO_INCREMENT в InnoDB» и Инициализация счётчика InnoDB AUTO_INCREMENT. В случае обнаружения повреждения дерева индекса
InnoDBзаписывает флаг повреждения в журнал обратной записи, что делает флаг повреждения безопасным при сбоях.InnoDBтакже записывает данные флага повреждения в памяти в частную таблицу системы движка в каждом контрольном пункте. Во время восстановленияInnoDBсчитывает флаги повреждения из обоих расположений и объединяет результаты перед пометкой объектов таблицы и индекса в памяти как повреждённых.Удаление журналов обратной записи для ускорения восстановления не рекомендуется, даже если допустимы некоторые потери данных. Удаление журналов обратной записи следует рассматривать только после чистой остановки, с
innodb_fast_shutdownустановленным в0или1.
-
-
незавершенных
Незавершенными транзакциями являются любые транзакции, которые были активны в момент неожиданного выхода из строя или . Время, необходимое для отката незавершенной транзакции, может быть в три или четыре раза больше, чем время, в течение которого транзакция активна до прерывания, в зависимости от нагрузки на сервер.
Вы не можете отменить транзакции, которые откатываются. В крайних случаях, когда ожидается, что откат транзакций займет чрезвычайно много времени, может быть быстрее запустить
InnoDBсinnodb_force_recoveryзначением3или больше. См. Раздел 17.20.3, «Принудительное восстановление InnoDB». -
Объединение
Применение изменений из буфера изменений (части ) к страницам листов вторичных индексов, так как страницы индексов считываются в буферный пул.
-
Удаление отмеченных к удалению записей, которые больше не видны активным транзакциям.
Шаги, следующие за применением журнала обратной записи, не зависят от журнала обратной записи (кроме записи записей) и выполняются параллельно с обычной обработкой. Из них только откат незавершенных транзакций является специальным для восстановления после сбоя. Объединение буфера вставок и очистка выполняются в ходе обычной обработки.
После применения журнала обратной записи InnoDB пытается принять подключения как можно раньше, чтобы сократить время простоя. В рамках восстановления после сбоя InnoDB откатывает транзакции, которые не были сохранены или находились в состоянии XA
PREPARE, когда сервер завершил работу. Откат выполняется фоновым потоком, выполняемым параллельно с транзакциями новых подключений. До тех пор, пока операция отката не будет завершена, новые подключения могут столкнуться с конфликтами блокировок с восстановленными транзакциями.
В большинстве ситуаций, даже если сервер MySQL был неожиданно остановлен посреди активной работы, процесс восстановления происходит автоматически, и от DBA не требуется никаких действий. Если отказ оборудования или серьезная ошибка системы повредила данные InnoDB, MySQL может отказаться запускаться. В этом случае см. Раздел 17.20.3, «Принудительное восстановление InnoDB».
Для получения информации о бинарном журнале и InnoDB восстановлении после сбоя, см. Раздел 7.4.4, «Бинарный журнал».
Обнаружение табличного пространства во время восстановления после сбоя
Если во время восстановления InnoDB обнаруживает журналы обратной записи, записанные с момента последнего контрольного пункта, журналы обратной записи должны быть применены к соответствующим табличным пространствам. Процесс, определяющий соответствующие табличные пространства во время восстановления, называется обнаружением табличного пространства.
Обнаружение табличного пространства зависит от параметра innodb_directories, который определяет каталоги для сканирования при запуске в поисках файлов табличных пространств. Значение по умолчанию для innodb_directories — NULL, но каталоги, определённые параметрами innodb_data_home_dir, innodb_undo_directory и datadir всегда добавляются к аргументу innodb_directories при построении InnoDB списка каталогов для сканирования при запуске. Эти каталоги добавляются независимо от того, указан ли параметр innodb_directories явно. Файлы табличных пространств, определённые с абсолютным путём или находящиеся вне каталогов, добавленных к параметру innodb_directories, должны быть добавлены в параметр innodb_directories. Восстановление прекращается, если какой-либо файл табличного пространства, на который ссылается журнал обратной записи, не был обнаружен ранее.
© 2025 Oracle
Licensed under the GPLv2 License.