17.6.5 Журнал переигрывания
Журнал переигрывания — это дисковая структура данных, используемая во время восстановления после сбоя для исправления данных, записанных неполными транзакциями. Во время нормальной работы журнал переигрывания кодирует запросы на изменение данных таблицы, которые являются результатом SQL-запросов или вызовов API низкого уровня. Изменения, которые не завершили обновление файлов данных до внезапной остановки, автоматически переигрываются во время инициализации и перед принятием подключений. Дополнительную информацию о роли журнала переигрывания в восстановлении после сбоя см. в разделе 17.18.2 «Восстановление InnoDB».
Физически журнал переигрывания представлен на диске файлами журнала переигрывания. Данные, которые записываются в файлы журнала переигрывания, кодируются в терминах затронутых записей, и эти данные в совокупности называются данными переигрывания. Прохождение данных через файлы журнала переигрывания представлено постоянно возрастающим значением. Данные журнала переигрывания добавляются по мере возникновения изменений данных, а самые старые данные обрезаются по мере продвижения контрольной точки.
Сведения и процедуры, связанные с журналами переигрывания, описаны в следующих темах раздела:
Настройка емкости журнала переигрывания
Системная переменная innodb_redo_log_capacity управляет объемом дискового пространства, занимаемого файлами журнала переигрывания. Вы можете установить эту переменную в файле опций при запуске или во время выполнения, используя оператор SET
GLOBAL; например, следующая команда устанавливает емкость журнала переигрывания в 8 ГБ:
SET GLOBAL innodb_redo_log_capacity = 8589934592;При установке во время выполнения изменение конфигурации происходит немедленно, но для полного внедрения нового ограничения может потребоваться некоторое время. Если файлы журнала переигрывания занимают меньше места, чем указанное значение, грязные страницы сбрасываются из буфера пула в файлы данных табличного пространства менее активно, что в конечном итоге увеличивает дисковое пространство, занимаемое файлами журнала переигрывания. Если файлы журнала переигрывания занимают больше места, чем указанное значение, грязные страницы сбрасываются более активно, что в конечном итоге уменьшает дисковое пространство, занимаемое файлами журнала переигрывания.
Если innodb_redo_log_capacity не определено, и если ни innodb_log_file_size, ни innodb_log_files_in_group не определены, то используется значение по умолчанию innodb_redo_log_capacity.
Если innodb_redo_log_capacity не определено, и если innodb_log_file_size и/или innodb_log_files_in_group определены, емкость журнала переигрывания InnoDB рассчитывается как (innodb_log_files_in_group * innodb_log_file_size). Этот расчет не изменяет значение неиспользуемого параметра innodb_redo_log_capacity.
Статус-переменная сервера Innodb_redo_log_capacity_resized указывает общую емкость журнала переигрывания для всех файлов журнала переигрывания.
Файлы журнала переигрывания находятся в каталоге #innodb_redo в каталоге данных, если не был указан другой каталог переменной innodb_log_group_home_dir. Если innodb_log_group_home_dir был определен, то файлы журнала переигрывания находятся в каталоге #innodb_redo в этом каталоге. Существует два типа файлов журнала переигрывания: обычные и резервные. Обычные файлы журнала переигрывания — это используемые файлы. Резервные файлы журнала переигрывания — это файлы, ожидающие использования. InnoDB пытается поддерживать общее количество 32 файлов журнала переигрывания, при этом каждый файл равен по размеру 1/32 * innodb_redo_log_capacity; однако размеры файлов могут отличаться некоторое время после изменения параметра innodb_redo_log_capacity.
Файлы журнала переигрывания используют соглашение об именовании #ib_redo, где NN — номер файла журнала переигрывания. Резервные файлы журнала переигрывания обозначаются суффиксом _tmp. Следующий пример показывает файлы журнала переигрывания в каталоге #innodb_redo, где есть 21 активный файл журнала переигрывания и 11 резервных файлов журнала переигрывания, пронумерованные последовательно.
'#ib_redo582' '#ib_redo590' '#ib_redo598' '#ib_redo606_tmp'
'#ib_redo583' '#ib_redo591' '#ib_redo599' '#ib_redo607_tmp'
'#ib_redo584' '#ib_redo592' '#ib_redo600' '#ib_redo608_tmp'
'#ib_redo585' '#ib_redo593' '#ib_redo601' '#ib_redo609_tmp'
'#ib_redo586' '#ib_redo594' '#ib_redo602' '#ib_redo610_tmp'
'#ib_redo587' '#ib_redo595' '#ib_redo603_tmp' '#ib_redo611_tmp'
'#ib_redo588' '#ib_redo596' '#ib_redo604_tmp' '#ib_redo612_tmp'
'#ib_redo589' '#ib_redo597' '#ib_redo605_tmp' '#ib_redo613_tmp'
Каждый обычный файл журнала переигрывания связан с определенным диапазоном значений LSN; например, следующий запрос показывает значения START_LSN и END_LSN для активных файлов журнала переигрывания, перечисленных в предыдущем примере:
mysql> SELECT FILE_NAME, START_LSN, END_LSN FROM performance_schema.innodb_redo_log_files;
+----------------------------+--------------+--------------+
| FILE_NAME | START_LSN | END_LSN |
+----------------------------+--------------+--------------+
| ./#innodb_redo/#ib_redo582 | 117654982144 | 117658256896 |
| ./#innodb_redo/#ib_redo583 | 117658256896 | 117661531648 |
| ./#innodb_redo/#ib_redo584 | 117661531648 | 117664806400 |
| ./#innodb_redo/#ib_redo585 | 117664806400 | 117668081152 |
| ./#innodb_redo/#ib_redo586 | 117668081152 | 117671355904 |
| ./#innodb_redo/#ib_redo587 | 117671355904 | 117674630656 |
| ./#innodb_redo/#ib_redo588 | 117674630656 | 117677905408 |
| ./#innodb_redo/#ib_redo589 | 117677905408 | 117681180160 |
| ./#innodb_redo/#ib_redo590 | 117681180160 | 117684454912 |
| ./#innodb_redo/#ib_redo591 | 117684454912 | 117687729664 |
| ./#innodb_redo/#ib_redo592 | 117687729664 | 117691004416 |
| ./#innodb_redo/#ib_redo593 | 117691004416 | 117694279168 |
| ./#innodb_redo/#ib_redo594 | 117694279168 | 117697553920 |
| ./#innodb_redo/#ib_redo595 | 117697553920 | 117700828672 |
| ./#innodb_redo/#ib_redo596 | 117700828672 | 117704103424 |
| ./#innodb_redo/#ib_redo597 | 117704103424 | 117707378176 |
| ./#innodb_redo/#ib_redo598 | 117707378176 | 117710652928 |
| ./#innodb_redo/#ib_redo599 | 117710652928 | 117713927680 |
| ./#innodb_redo/#ib_redo600 | 117713927680 | 117717202432 |
| ./#innodb_redo/#ib_redo601 | 117717202432 | 117720477184 |
| ./#innodb_redo/#ib_redo602 | 117720477184 | 117723751936 |
+----------------------------+--------------+--------------+
При выполнении контрольной точки InnoDB сохраняет LSN контрольной точки в заголовке файла, который содержит эту LSN. Во время восстановления все файлы журнала переигрывания проверяются, и восстановление начинается с последней LSN контрольной точки.
Для мониторинга операций изменения размера журнала переигрывания и журнала переигрывания предоставляется несколько переменных статуса; например, вы можете запросить Innodb_redo_log_resize_status для просмотра статуса операции изменения размера:
mysql> SHOW STATUS LIKE 'Innodb_redo_log_resize_status';
+-------------------------------+-------+
| Variable_name | Value |
+-------------------------------+-------+
| Innodb_redo_log_resize_status | OK |
+-------------------------------+-------+
Статус-переменная Innodb_redo_log_capacity_resized отображает текущее ограничение емкости журнала переигрывания:
mysql> SHOW STATUS LIKE 'Innodb_redo_log_capacity_resized';
+----------------------------------+-----------+
| Variable_name | Value |
+----------------------------------+-----------+
| Innodb_redo_log_capacity_resized | 104857600 |
+----------------------------------+-----------+
Другие применимые переменные статуса включают:
Для получения дополнительной информации обратитесь к описаниям переменных статуса.
Информацию об активных файлах журнала переигрывания можно получить, запросив таблицу Performance Schema innodb_redo_log_files. Следующий запрос извлекает данные из всех столбцов таблицы:
SELECT FILE_ID, START_LSN, END_LSN, SIZE_IN_BYTES, IS_FULL, CONSUMER_LEVEL
FROM performance_schema.innodb_redo_log_files;
Автоматическая настройка емкости журнала переигрывания
При запуске сервера с --innodb-dedicated-server, InnoDB автоматически вычисляет и устанавливает значения определённых параметров InnoDB, включая емкость журнала переигрывания. Автоматическая настройка предназначена для экземпляров MySQL, которые находятся на сервере, посвященном MySQL, где сервер MySQL может использовать все доступные системные ресурсы. Дополнительную информацию см. в разделе 17.8.12 «Включение автоматической настройки InnoDB для выделенного сервера MySQL».
Архивирование журнала redo
Утилиты резервного копирования, копирующие записи журнала redo, иногда не успевают за генерацией записей журнала redo во время операции резервного копирования, что приводит к потере записей журнала redo из-за их перезаписи. Эта проблема чаще всего возникает, когда во время операции резервного копирования наблюдается значительная активность сервера MySQL, а носитель хранения файла журнала redo работает быстрее, чем носитель хранения резервной копии. Функция архивирования журнала redo решает эту проблему, последовательно записывая записи журнала redo в архивный файл помимо файлов журнала redo. Утилиты резервного копирования могут копировать записи журнала redo из архивного файла по мере необходимости, тем самым избегая потенциальной потери данных.
Если архивирование журнала redo настроено на сервере, MySQL Enterprise Backup, доступный с MySQL Enterprise Edition, использует функцию архивирования журнала redo при резервном копировании сервера MySQL.
Для активации архивирования журнала redo на сервере необходимо установить значение для системной переменной innodb_redo_log_archive_dirs. Значение задается как список каталогов архива журнала redo, разделенных точкой с запятой и снабженных метками. Пара разделяется двоеточием (label:directory:). Например:
mysql> SET GLOBAL innodb_redo_log_archive_dirs='label1:directory_path1[;label2:directory_path2;…]'; label — произвольный идентификатор каталога архива. Это может быть любая строка символов, за исключением двоеточий (:), которые запрещены. Разрешается пустая метка, но в этом случае двоеточие (:) все равно требуется. directory_path обязательно. Каталог, выбранный для файла архива журнала redo, должен существовать при активации архивирования журнала redo, иначе возвращается ошибка. Путь может содержать двоеточия (:), но точки с запятой (;) запрещены.
Переменная innodb_redo_log_archive_dirs должна быть настроена перед активацией архивирования журнала redo. Значение по умолчанию — NULL, что не позволяет активировать архивирование журнала redo.
Указанные вами каталоги архивов должны удовлетворять следующим требованиям. (Требования применяются при активации архивирования журнала redo.):
-
Каталоги должны существовать. Каталоги не создаются процессом архивирования журнала redo. В противном случае возвращается следующая ошибка:
ОШИБКА 3844 (HY000): Каталог архива журнала redo '
directory_path1' не существует или не является каталогом -
Каталоги не должны быть доступны всем пользователям системы. Это предотвращает доступ к данным журнала redo неавторизованным пользователям системы. В противном случае возвращается следующая ошибка:
ОШИБКА 3846 (HY000): Каталог архива журнала redo '
directory_path1' доступен всем пользователям ОС -
Каталоги не могут быть определены переменными
datadir,innodb_data_home_dir,innodb_directories,innodb_log_group_home_dir,innodb_temp_tablespaces_dir,innodb_tmpdirinnodb_undo_directoryилиsecure_file_priv, а также не могут быть родительскими или дочерними каталогами этих каталогов. В противном случае возвращается ошибка, похожая на следующую:ОШИБКА 3845 (HY000): Каталог архива журнала redo '
directory_path1' находится в, под или над каталогом сервера 'datadir' - '/path/to/data_directory'
Когда утилита резервного копирования, поддерживающая архивирование журнала redo, запускает резервное копирование, утилита резервного копирования активирует архивирование журнала redo, вызывая функцию innodb_redo_log_archive_start().
Если вы не используете утилиту резервного копирования, которая поддерживает архивирование журнала redo, архивирование журнала redo также можно активировать вручную, как показано:
mysql> SELECT innodb_redo_log_archive_start('label', 'subdir');
+------------------------------------------+
| innodb_redo_log_archive_start('label') |
+------------------------------------------+
| 0 |
+------------------------------------------+
Или:
mysql> DO innodb_redo_log_archive_start('label', 'subdir');
Query OK, 0 rows affected (0.09 sec)
Сеанс MySQL, активирующий архивирование журнала redo (с помощью innodb_redo_log_archive_start()), должен оставаться открытым в течение всего процесса архивирования. Тот же сеанс должен деактивировать архивирование журнала redo (с помощью innodb_redo_log_archive_stop()). Если сеанс завершен до явного деактивирования архивирования журнала redo, сервер неявно деактивирует архивирование журнала redo и удалит файл архива журнала redo.
где label — метка, определенная переменной innodb_redo_log_archive_dirs; subdir — необязательный аргумент для указания подкаталога каталога, указанного label, для сохранения архивного файла; это должно быть простое имя каталога (не допускаются слеши (/), обратные слеши (\) или двоеточия (:). subdir может быть пустым, нулевым или его можно опустить.
Только пользователи с привилегией INNODB_REDO_LOG_ARCHIVE могут активировать архивирование журнала redo, вызвав innodb_redo_log_archive_start(), или деактивировать его, используя innodb_redo_log_archive_stop(). Пользователь MySQL, выполняющий утилиту резервного копирования или пользователь MySQL, активирующий и деактивирующий архивирование журнала redo вручную, должен обладать этой привилегией.
Путь к файлу архива журнала redo — , где directory_identified_by_label/[subdir/]archive.serverUUID.000001.log — каталог архива, определенный аргументом directory_identified_by_label для функции labelinnodb_redo_log_archive_start(). — необязательный аргумент, используемый для subdirinnodb_redo_log_archive_start().
Например, полный путь и имя файла архива журнала redo выглядят примерно так:
/directory_path/subdirectory/archive.e71a47dc-61f8-11e9-a3cb-080027154b4d.000001.log
После того, как утилита резервного копирования завершит копирование InnoDB файлов данных, она деактивирует архивирование журнала redo, вызвав функцию innodb_redo_log_archive_stop().
Если вы не используете утилиту резервного копирования, поддерживающую архивирование журнала redo, архивирование журнала redo также можно деактивировать вручную, как показано:
mysql> SELECT innodb_redo_log_archive_stop();
+--------------------------------+
| innodb_redo_log_archive_stop() |
+--------------------------------+
| 0 |
+--------------------------------+
Или:
mysql> DO innodb_redo_log_archive_stop();
Query OK, 0 rows affected (0.01 sec)
После успешного завершения функции остановки утилита резервного копирования ищет соответствующий раздел данных журнала redo в архивном файле и копирует его в резервную копию.
После того как утилита резервного копирования завершит копирование данных журнала redo и больше не нуждается в файле архива журнала redo, она удаляет архивный файл.
Удаление архивного файла является обязанностью утилиты резервного копирования в обычных ситуациях. Однако, если операция архивирования журнала redo неожиданно завершится до вызова innodb_redo_log_archive_stop(), сервер MySQL удалит файл.
Соображения по производительности
Активация архивирования журнала redo обычно приводит к небольшим затратам производительности из-за дополнительной активности записи.
В операционных системах Unix и Unix-подобных системах влияние на производительность обычно незначительно, если не наблюдается устойчиво высокая скорость обновлений. В Windows влияние на производительность обычно немного выше при тех же условиях.
Если наблюдается устойчиво высокая скорость обновлений, а файл архива журнала redo находится на том же носителе, что и файлы журнала redo, влияние на производительность может быть более значительным из-за комбинированной активности записи.
Если наблюдается устойчиво высокая скорость обновлений, а файл архива журнала redo находится на более медленном носителе, чем файлы журнала redo, производительность ухудшается произвольно.
Запись в файл архива журнала redo не препятствует нормальному ведению транзакционного журнала, за исключением случаев, когда носитель хранения файла архива журнала redo работает намного медленнее, чем носитель хранения файлов журнала redo, и имеется большая задержка постоянных блоков журнала redo, ожидающих записи в файл архива журнала redo. В этом случае скорость транзакционного журналирования снижается до уровня, который может быть обработан более медленным носителем, где находится файл архива журнала redo.
Отключение журналирования redo
Вы можете отключить журналирование redo, используя оператор ALTER INSTANCE
DISABLE INNODB REDO_LOG. Эта функция предназначена для загрузки данных в новый экземпляр MySQL. Отключение журналирования redo ускоряет загрузку данных, избегая записи в журнал redo и буферизации doublewrite.
Эта функция предназначена только для загрузки данных в новый экземпляр MySQL. Не отключайте журналирование redo в рабочей системе. Разрешено выключение и перезапуск сервера при отключенном журналировании redo, но неожиданная остановка сервера при отключенном журналировании redo может привести к потере данных и повреждению экземпляра.
Попытка перезапустить сервер после неожиданной остановки при отключенном журналировании redo отклоняется с ошибкой:
[ERROR] [MY-013598] [InnoDB] Server was killed when Innodb Redo
logging was disabled. Data files could be corrupt. You can try
to restart the database with innodb_force_recovery=6
В этом случае инициализируйте новый экземпляр MySQL и запустите процедуру загрузки данных снова.
Для включения и отключения журналирования redo требуется привилегия INNODB_REDO_LOG_ENABLE.
Статус журналирования redo можно отслеживать с помощью переменной состояния Innodb_redo_log_enabled.
Операции клонирования и архивирования журнала redo запрещены при отключенном журналировании redo и наоборот.
Операция ALTER
INSTANCE [ENABLE|DISABLE] INNODB REDO_LOG требует эксклюзивной блокировки метаданных резервной копии, что предотвращает одновременное выполнение других операций ALTER INSTANCE. Другие операции ALTER
INSTANCE должны ждать освобождения блокировки перед выполнением.
Следующая процедура демонстрирует, как отключить журналирование redo при загрузке данных в новый экземпляр MySQL.
-
В новом экземпляре MySQL предоставьте пользователю, ответственному за отключение журналирования redo, привилегию
INNODB_REDO_LOG_ENABLE.mysql> GRANT INNODB_REDO_LOG_ENABLE ON *.* to 'data_load_admin';
-
В качестве пользователя
data_load_adminотключите журналирование redo:mysql> ALTER INSTANCE DISABLE INNODB REDO_LOG;
-
Проверьте переменную состояния
Innodb_redo_log_enabled, чтобы убедиться, что журналирование redo отключено.mysql>
SHOW GLOBAL STATUS LIKE 'Innodb_redo_log_enabled';+-------------------------+-------+ | Variable_name | Value | +-------------------------+-------+ | Innodb_redo_log_enabled | OFF | +-------------------------+-------+ Выполните операцию загрузки данных.
-
В качестве пользователя
data_load_adminвключите журналирование redo после завершения операции загрузки данных:mysql> ALTER INSTANCE ENABLE INNODB REDO_LOG;
-
Проверьте переменную состояния
Innodb_redo_log_enabled, чтобы убедиться, что журналирование redo включено.mysql>
SHOW GLOBAL STATUS LIKE 'Innodb_redo_log_enabled';+-------------------------+-------+ | Variable_name | Value | +-------------------------+-------+ | Innodb_redo_log_enabled | ON | +-------------------------+-------+
Связанные темы
© 2025 Oracle
Licensed under the GPLv2 License.