17.6.4 Буфер двойной записи
Буфер двойной записи — это область хранения, где InnoDB записывает страницы, вытесненные из буфера пула, прежде чем записать их в свои правильные позиции в InnoDB файлах данных. Если в середине записи страницы произойдёт выход из строя операционной системы, подсистемы хранения или неожиданный выход процесса mysqld, InnoDB сможет найти правильную копию страницы в буфере двойной записи во время восстановления после сбоя.
Несмотря на то, что данные записываются дважды, буфер двойной записи не требует двойного увеличения накладных расходов на ввод-вывод или двойного количества операций ввода-вывода. Данные записываются в буфер двойной записи в большом последовательном блоке с помощью одной fsync() вызова операционной системы (за исключением случаев, когда innodb_flush_method установлено в значение O_DIRECT_NO_FSYNC).
Область хранения буфера двойной записи находится в файлах двойной записи.
Для настройки буфера двойной записи предоставляются следующие переменные:
-
Переменная
innodb_doublewriteуправляет включением буфера двойной записи. Он включён по умолчанию в большинстве случаев. Чтобы отключить буфер двойной записи, установитеinnodb_doublewriteв значениеOFF. Рассмотрите возможность отключения буфера двойной записи, если вас больше беспокоит производительность, чем целостность данных, как, например, при проведении бенчмарков.innodb_doublewriteподдерживаетDETECT_AND_RECOVERиDETECT_ONLYнастройки.Настройка
DETECT_AND_RECOVERидентична настройкеON. С этой настройкой буфер двойной записи полностью включён, и содержимое страниц базы данных записывается в буфер двойной записи, где к нему обращаются при восстановлении для исправления неполных записей страниц.С настройкой
DETECT_ONLYв буфер двойной записи записывается только метаданные. Содержимое страниц базы данных не записывается в буфер двойной записи, и восстановление не использует буфер двойной записи для исправления неполных записей страниц. Эта облегчённая настройка предназначена только для обнаружения неполных записей страниц.MySQL поддерживает динамические изменения настройки
innodb_doublewrite, включающей буфер двойной записи, междуON,DETECT_AND_RECOVERиDETECT_ONLY. MySQL не поддерживает динамические изменения между настройкой, включающей буфер двойной записи, иOFF, и наоборот.Если буфер двойной записи расположен на устройстве Fusion-io, поддерживающем атомарные записи, буфер двойной записи автоматически отключается, и записи в файлы данных выполняются с помощью атомарных записей Fusion-io вместо этого. Однако имейте в виду, что настройка
innodb_doublewriteявляется глобальной. Когда буфер двойной записи отключён, он отключён для всех файлов данных, включая те, которые не находятся на оборудовании Fusion-io. Эта функция поддерживается только на оборудовании Fusion-io и включена только для Fusion-io NVMFS в Linux. Для максимальной эффективности рекомендуется настройкаinnodb_flush_methodсо значениемO_DIRECT. -
Переменная
innodb_doublewrite_dirопределяет каталог, в которомInnoDBсоздаёт файлы двойной записи. Если каталог не указан, файлы двойной записи создаются в каталогеinnodb_data_home_dir, который по умолчанию является каталогом данных, если не указан другой.Символ «#» автоматически добавляется в начало указанного имени каталога, чтобы избежать конфликтов с именами схем. Однако, если в имени каталога явно указаны префиксы «.», «#» или «/», символ «#» не добавляется в начало имени каталога.
В идеале каталог двойной записи должен располагаться на носителе с наибольшей скоростью.
-
Переменная
innodb_doublewrite_filesопределяет количество файлов двойной записи, по умолчанию равное 2. По умолчанию для каждого экземпляра буфера пула создаются два файла двойной записи: файл двойной записи списка сброса и файл двойной записи списка LRU.Файл двойной записи списка сброса предназначен для страниц, вытесненных из списка сброса буфера пула. Размер файла двойной записи списка сброса по умолчанию составляет
InnoDBразмер страницы * байты двойной записи.Файл двойной записи списка LRU предназначен для страниц, вытесненных из списка LRU буфера пула. Он также содержит места для отдельных записей страниц. Размер файла двойной записи списка LRU по умолчанию составляет
InnoDBразмер страницы * (страницы двойной записи + (512 / количество экземпляров буфера пула)), где 512 — это общее количество мест, зарезервированных для отдельных записей страниц.Минимальное количество файлов двойной записи равно двум. Максимальное количество файлов двойной записи — это дважды количество экземпляров буфера пула. (Количество экземпляров буфера пула регулируется переменной
innodb_buffer_pool_instances.)Имена файлов двойной записи имеют следующий формат:
#ib_(илиpage_size_file_number.dblwr.bdblwrс настройкойDETECT_ONLY). Например, для экземпляра MySQL с размером страницInnoDB16 КБ и одним буфером пула создаются следующие файлы двойной записи:#ib_16384_0.dblwr #ib_16384_1.dblwr
Переменная
innodb_doublewrite_filesпредназначена для продвинутой настройки производительности. Значение по умолчанию должно быть подходящим для большинства пользователей. -
Переменная
innodb_doublewrite_pagesконтролирует максимальное количество страниц двойной записи на поток. Эта переменная предназначена для продвинутой настройки производительности. Значение по умолчанию должно быть подходящим для большинства пользователей.
InnoDB автоматически шифрует страницы файлов двойной записи, относящиеся к зашифрованным табличным пространствам (см. Раздел 17.13, «Шифрование InnoDB данных в состоянии покоя»). Аналогично, страницы файлов двойной записи, принадлежащие сжатым по страницам табличным пространствам, сжимаются. В результате файлы двойной записи могут содержать различные типы страниц, включая нешифрованные и несжатые страницы, зашифрованные страницы, сжатые страницы и страницы, которые одновременно зашифрованы и сжаты.
© 2025 Oracle
Licensed under the GPLv2 License.