Spec-Zone.ru › MariaDB

InnoDB Purge

Когда транзакция обновляет строку в таблице InnoDB, реализация MVCC InnoDB сохраняет старые версии строки в журнале отката InnoDB. Старые версии хранятся как минимум до тех пор, пока все транзакции, более старые, чем транзакция, обновившая строку, не будут закрыты. В этот момент старые версии можно удалить. InnoDB имеет процесс очистки, который используется для удаления этих старых версий.

Оптимизация производительности очистки

Настройка потоков очистки

Количество потоков очистки можно установить, настроив системную переменную innodb_purge_threads. Эту системную переменную можно указать в качестве аргумента командной строки для mysqld, или же в соответствующей группе параметров сервера в файле опций группа параметров в файле параметров. Например:

[mariadb]
...
innodb_purge_threads = 6

Настройка размера пакета очистки

Размер пакета очистки определяется как количество записей журнала переопределения InnoDB, которые должны быть записаны перед запуском очистки. Размер пакета очистки можно установить, настроив системную переменную innodb_purge_batch_size. Эту системную переменную можно указать в качестве аргумента командной строки для mysqld, или же в соответствующей группе параметров сервера в файле опций группа параметров в файле параметров. Например:

[mariadb]
...
innodb_purge_batch_size = 50

Настройка максимальной задержки очистки

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

Максимальную задержку очистки можно установить, настроив системную переменную innodb_max_purge_lag. Эту системную переменную можно изменить динамически с помощью SET GLOBAL. Например:

SET GLOBAL innodb_max_purge_lag=1000;

Эту системную переменную также можно указать в качестве аргумента командной строки для mysqld, или же в соответствующей группе параметров сервера в файле опций группа параметров в файле параметров. Например:

[mariadb]
...
innodb_max_purge_lag = 1000

Максимальную задержку можно установить, настроив системную переменную innodb_max_purge_lag_delay. Эту системную переменную можно изменить динамически с помощью SET GLOBAL. Например:

SET GLOBAL innodb_max_purge_lag_delay=100;

Эту системную переменную также можно указать в качестве аргумента командной строки для mysqld, или же в соответствующей группе параметров сервера в файле опций группа параметров в файле параметров. Например:

[mariadb]
...
innodb_max_purge_lag_delay = 100

Настройка частоты усечения сегментов отката очистки

Частота усечения сегментов отката очистки определяется как количество циклов очистки, которые выполняются до усечения ненужных сегментов отката. Частоту усечения сегментов отката очистки можно установить, настроив системную переменную innodb_purge_rseg_truncate_frequency. Эту системную переменную можно изменить динамически с помощью SET GLOBAL. Например:

SET GLOBAL innodb_purge_rseg_truncate_frequency=64;

Эту системную переменную также можно указать в качестве аргумента командной строки для mysqld, или же в соответствующей группе параметров сервера в файле опций группа параметров в файле параметров. Например:

[mariadb]
...
innodb_purge_rseg_truncate_frequency = 64

Настройка усечения журнала отката очистки

Усечение журнала отката очистки происходит, когда InnoDB усекает целую табличную область журнала отката InnoDB, а не удаляет отдельные записи журнала отката InnoDB.

Усечение журнала отката очистки можно включить, настроив системную переменную innodb_undo_log_truncate. Эту системную переменную можно изменить динамически с помощью SET GLOBAL. Например:

SET GLOBAL innodb_undo_log_truncate=ON;

Эту системную переменную также можно указать в качестве аргумента командной строки для mysqld, или же в соответствующей группе параметров сервера в файле опций группа параметров в файле параметров. Например:

[mariadb]
...
innodb_undo_log_truncate = ON

Таблица пространства данных журнала отката InnoDB усекается, когда она превышает максимальный размер, настроенный для табличных областей журнала отката InnoDB. Максимальный размер можно установить, настроив системную переменную innodb_max_undo_log_size. Эту системную переменную можно изменить динамически с помощью SET GLOBAL. Например:

SET GLOBAL innodb_max_undo_log_size='64M';

Эту системную переменную также можно указать в качестве аргумента командной строки для mysqld, или же в соответствующей группе параметров сервера в файле опций группа параметров в файле параметров. Например:

[mariadb]
...
innodb_max_undo_log_size = 64M

Влияние очистки на метаданные строк

Кластерный индекс таблицы InnoDB имеет три скрытых системных столбца, которые автоматически генерируются. Эти скрытые системные столбцы:

  • DB_ROW_ID - Если таблица не имеет других PRIMARY KEY или других UNIQUE KEY определённых как NOT NULL которые могут быть подняты до PRIMARY KEY таблицы, тогда InnoDB будет использовать скрытый системный столбец, называемый DB_ROW_ID. InnoDB автоматически сгенерирует значение для столбца из глобальной 48-битной последовательности InnoDB (вместо того, чтобы быть локальной для таблицы).
  • DB_TRX_ID - Идентификатор транзакции либо транзакции, которая последней изменила строку, либо транзакции, которая в настоящее время блокирует строку.
  • DB_ROLL_PTR - Указатель на журнал отката InnoDB, содержащий предыдущую запись строки. Значение DB_ROLL_PTR является допустимым только если DB_TRX_ID принадлежит текущей точке чтения. Самая старая допустимая точка чтения — это точка чтения очистки.

Если последняя запись журнала отката InnoDB строки удалена, это очевидно повлияет на значение столбца DB_ROLL_PTR строки, потому что больше не будет никакой записи журнала отката InnoDB для ссылки.

В MariaDB 10.2 и ранее, процесс очистки не трогал значение столбца DB_TRX_ID строки.

Однако, в MariaDB 10.3 и более поздних версиях, процесс очистки установит значение столбца DB_TRX_ID строки в 0 после того как все связанные записи журнала отката InnoDB строки были удалены. Эта смена позволяет InnoDB выполнить оптимизацию: если запрос хочет прочитать строку, и если столбец DB_TRX_ID строки установлен в 0, то он знает, что ни одна другая транзакция не блокирует строку. Обычно InnoDB необходимо заблокировать мьютекс системы транзакций, чтобы безопасно проверить, заблокирована ли строка, но эта оптимизация позволяет InnoDB подтвердить, что строка может быть безопасно прочитана без каких-либо тяжёлых внутренних блокировок.

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

Содержание, воспроизведённое на этом сайте, является собственностью соответствующих владельцев, и это содержание не предварительно проверяется MariaDB. Мнения, информация и мнения, выраженные в этом содержании, не обязательно отражают мнения MariaDB или любой другой стороны.

© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/innodb-purge/

Spec-Zone.ru

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