17.6.4 Буфер двойной записи
Буфер двойной записи — это область хранения, куда InnoDB записывает страницы, сброшенные из буферного пула, прежде чем записать эти страницы в их правильные позиции в файлах данных. Если в середине записи страницы произойдёт выход из строя операционной системы, подсистемы хранения или неожиданный выход процесса mysqld, во время восстановления после сбоя система сможет найти копию страницы в буфере двойной записи.
Хотя данные записываются дважды, буфер двойной записи не требует удвоенной нагрузки на ввод/вывод или удвоенного числа операций ввода/вывода. Данные записываются в буфер двойной записи в большом последовательном блоке с помощью одной операции ввода/вывода операционной системы (за исключением случаев, когда 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_methodO_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.