Spec-Zone.ru › MySQL 9.2

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_redoN, где N — номер файла журнала переигрывания. Резервные файлы журнала переигрывания обозначаются суффиксом _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 |
+----------------------------------+-----------+

Другие применимые переменные состояния включают:

  • Innodb_redo_log_checkpoint_lsn

  • Innodb_redo_log_current_lsn

  • Innodb_redo_log_flushed_to_disk_lsn

  • Innodb_redo_log_logical_size

  • Innodb_redo_log_physical_size

  • Innodb_redo_log_read_only

  • Innodb_redo_log_uuid

Для получения дополнительной информации см. описания переменных состояния.

Информацию об активных файлах журнала переигрывания можно получить, обратившись к таблице 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».

Архивирование журналов переигрывания

Утилиты резервного копирования, которые копируют записи журнала переигрывания, иногда не успевают за генерацией журнала переигрывания во время операции резервного копирования, что приводит к потере записей журнала переигрывания из-за их перезаписи. Эта проблема чаще всего возникает, когда в процессе резервного копирования наблюдается значительная активность сервера MySQL, а носитель хранения файла журнала переигрывания работает быстрее, чем носитель хранения резервной копии. Функция архивирования журнала переигрывания решает эту проблему, последовательно записывая записи журнала переигрывания в архивный файл помимо файлов журнала переигрывания. Утилиты резервного копирования могут по мере необходимости копировать записи журнала переигрывания из архивного файла, тем самым избегая потенциальной потери данных.

Если архивирование журнала переигрывания настроено на сервере, MySQL Enterprise Backup, доступный с MySQL Enterprise Edition, использует функцию архивирования журнала переигрывания при резервном копировании сервера MySQL.

Для включения архивирования журнала переигрывания на сервере необходимо установить значение для системной переменной innodb_redo_log_archive_dirs. Значение задается в виде списка архивных каталогов журнала переигрывания, разделенных точкой с запятой. Пара label:directory разделена двоеточием (:). Например:

mysql> SET GLOBAL innodb_redo_log_archive_dirs='label1:directory_path1[;label2:directory_path2;…]';

label — произвольный идентификатор каталога архива. Он может быть любой строкой символов, за исключением двоеточий (:), которые запрещены. Разрешена и пустая метка, но двоеточие (:) всё равно требуется в этом случае. Необходимо указать directory_path. Каталог, выбранный для файла архива журнала переигрывания, должен существовать при активации архивирования журнала переигрывания, в противном случае возвращается ошибка. Путь может содержать двоеточия (:), но точки с запятой (;) запрещены.

Переменная innodb_redo_log_archive_dirs должна быть настроена перед активацией архивирования журнала переигрывания. Значение по умолчанию — NULL, что не позволяет активировать архивирование журнала переигрывания.

Примечания

Указанные вами каталоги архивов должны соответствовать следующим требованиям. (Требования проверяются при активации архивирования журнала переигрывания.):

  • Каталоги должны существовать. Каталоги не создаются процессом архивирования журнала переигрывания. В противном случае возвращается следующая ошибка:

    ОШИБКА 3844 (HY000): Каталог архива журнала переигрывания 'directory_path1' не существует или не является каталогом

  • Каталоги не должны быть доступны для всех пользователей системы. Это предотвращает доступ к данным журнала переигрывания неавторизованным пользователям системы. В противном случае возвращается следующая ошибка:

    ОШИБКА 3846 (HY000): Каталог архива журнала переигрывания 'directory_path1' доступен всем пользователям ОС

  • Каталоги не могут быть теми, которые определены переменными datadir, innodb_data_home_dir, innodb_directories, innodb_log_group_home_dir, innodb_temp_tablespaces_dir, innodb_tmpdir innodb_undo_directory или secure_file_priv, а также не могут быть родительскими или дочерними каталогами этих каталогов. В противном случае возвращается ошибка, аналогичная следующей:

    ОШИБКА 3845 (HY000): Каталог архива журнала переигрывания 'directory_path1' находится в, под или над каталогом сервера 'datadir' - '/path/to/data_directory'

Когда утилита резервного копирования, поддерживающая архивирование журнала переигрывания, запускает резервное копирование, она активирует архивирование журнала переигрывания, вызвав функцию innodb_redo_log_archive_start().

Если вы не используете утилиту резервного копирования, которая поддерживает архивирование журнала переигрывания, архивирование журнала переигрывания также можно активировать вручную, как показано:

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, активирующая архивирование журнала переигрывания (с помощью innodb_redo_log_archive_start()), должна оставаться открытой на протяжении всего процесса архивирования. Та же сессия должна деактивировать архивирование журнала переигрывания (с помощью innodb_redo_log_archive_stop()). Если сессия завершается до явного деактивирования архивирования журнала переигрывания, сервер деактивирует архивирование журнала переигрывания неявно и удаляет файл архива журнала переигрывания.

где label — метка, определённая innodb_redo_log_archive_dirs; subdir — необязательный аргумент для указания подкаталога каталога, идентифицированного label для сохранения архивного файла; он должен быть простым именем каталога (не допускается использование слэша (/), обратного слэша (\) или двоеточия (:). subdir может быть пустым, null или опущен.

Только пользователи с привилегией INNODB_REDO_LOG_ARCHIVE могут активировать архивирование журнала переигрывания, вызвав innodb_redo_log_archive_start(), или деактивировать его, используя innodb_redo_log_archive_stop(). Пользователь MySQL, выполняющий утилиту резервного копирования или пользователь MySQL, активирующий и деактивирующий архивирование журнала переигрывания вручную, должен обладать этой привилегией.

Путь к файлу архива журнала переигрывания — directory_identified_by_label/[subdir/]archive.serverUUID.000001.log, где directory_identified_by_label — каталог архива, определённый аргументом label для innodb_redo_log_archive_start(). subdir — необязательный аргумент, используемый для innodb_redo_log_archive_start().

Например, полный путь и имя файла архива журнала переигрывания имеют следующий вид:

/directory_path/subdirectory/archive.e71a47dc-61f8-11e9-a3cb-080027154b4d.000001.log

После завершения копирования утилитой резервного копирования файлов данных InnoDB она деактивирует архивирование журнала переигрывания, вызвав функцию innodb_redo_log_archive_stop().

Если вы не используете утилиту резервного копирования, которая поддерживает архивирование журнала переигрывания, архивирование журнала переигрывания также можно деактивировать вручную, как показано:

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)

После успешного завершения функции stop утилита резервного копирования ищет соответствующую часть данных журнала переигрывания в архивном файле и копирует её в резервную копию.

После завершения копирования данных журнала переигрывания и если утилита резервного копирования больше не нуждается в файле архива журнала переигрывания, она удаляет архивный файл.

Удаление архивного файла является обязанностью утилиты резервного копирования в обычных ситуациях. Однако, если операция архивирования журнала переигрывания неожиданно завершается до вызова innodb_redo_log_archive_stop(), сервер MySQL удаляет файл.

Соображения по производительности

Активация архивирования журнала переигрывания обычно влечёт за собой незначительные затраты производительности из-за дополнительной активности записи.

В Unix-подобных операционных системах влияние на производительность обычно незначительно, если не наблюдается устойчиво высокая скорость обновлений. В Windows влияние на производительность обычно немного выше, при тех же условиях.

Если наблюдается устойчиво высокая скорость обновлений, а файл архива журнала переигрывания находится на том же носителе, что и файлы журнала переигрывания, влияние на производительность может быть более значительным из-за сложения активности записи.

Если наблюдается устойчиво высокая скорость обновлений, а файл архива журнала переигрывания находится на более медленном носителе, чем файлы журнала переигрывания, производительность ухудшается произвольно.

Запись в файл архива журнала переигрывания не препятствует нормальной транзакционной записи, за исключением случая, когда носитель хранения файла архива журнала переигрывания работает значительно медленнее, чем носитель хранения файлов журнала переигрывания, и имеется большая очередь сохраненных блоков журнала переигрывания, ждущих записи в файл архива журнала переигрывания. В этом случае скорость транзакционной записи снижается до уровня, который может обрабатывать более медленный носитель хранения, на котором находится файл архива журнала переигрывания.

Отключение журналирования 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.

  1. В новом экземпляре MySQL предоставьте пользователю, ответственному за отключение журналирования redo, привилегию INNODB_REDO_LOG_ENABLE.

    mysql> GRANT INNODB_REDO_LOG_ENABLE ON *.* to 'data_load_admin';
  2. В качестве пользователя data_load_admin отключите журналирование redo:

    mysql> ALTER INSTANCE DISABLE INNODB REDO_LOG;
  3. Проверьте переменную состояния Innodb_redo_log_enabled, чтобы убедиться, что журналирование redo отключено.

    mysql> SHOW GLOBAL STATUS LIKE 'Innodb_redo_log_enabled';
    +-------------------------+-------+
    | Variable_name           | Value |
    +-------------------------+-------+
    | Innodb_redo_log_enabled | OFF   |
    +-------------------------+-------+
    
  4. Выполните операцию загрузки данных.

  5. В качестве пользователя data_load_admin включите журналирование redo после завершения операции загрузки данных:

    mysql> ALTER INSTANCE ENABLE INNODB REDO_LOG;
  6. Проверьте переменную состояния Innodb_redo_log_enabled, чтобы убедиться, что журналирование redo включено.

    mysql> SHOW GLOBAL STATUS LIKE 'Innodb_redo_log_enabled';
    +-------------------------+-------+
    | Variable_name           | Value |
    +-------------------------+-------+
    | Innodb_redo_log_enabled | ON    |
    +-------------------------+-------+
    

Связанные темы

  • Настройка журнала redo

  • Раздел 10.5.4, «Оптимизация журналирования redo InnoDB»

  • Шифрование журнала redo

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-9.2-en/innodb-redo-log.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API