Spec-Zone.ru › MySQL 8.4

19.1.6.5 Переменные системы Global Transaction ID

Переменные системы MySQL Server, описанные в этом разделе, используются для мониторинга и управления глобальными идентификаторами транзакций (GTID). Дополнительную информацию см. в разделе 19.1.3 «Репликация с глобальными идентификаторами транзакций».

  • binlog_gtid_simple_recovery

    Формат командной строки --binlog-gtid-simple-recovery[={OFF|ON}]
    Переменная системы binlog_gtid_simple_recovery
    Область действия Глобальная
    Динамическая Нет
    SET_VAR Применимо ли ограничение Нет
    Тип Булево
    Значение по умолчанию ON

    Эта переменная управляет тем, как итеративно обрабатываются двоичные журналы при поиске GTID при запуске или перезапуске MySQL.

    Когда binlog_gtid_simple_recovery=TRUE (значение по умолчанию), значения gtid_executed и gtid_purged вычисляются при запуске на основе значений Previous_gtids_log_event в последних и самых старых двоичных журналах. Описание вычисления см. в переменной системы gtid_purged. Это значение обрабатывает только два двоичных журнала во время перезапуска сервера. Если все двоичные журналы на сервере были сгенерированы с MySQL 5.7.8 или более поздней версии, binlog_gtid_simple_recovery=TRUE всегда можно безопасно использовать.

    Если на сервере присутствуют двоичные журналы из MySQL 5.7.7 или более ранних версий (например, после обновления старого сервера до MySQL 8.4), с binlog_gtid_simple_recovery=TRUE, gtid_executed и gtid_purged могут быть инициализированы неправильно в следующих двух ситуациях:

    • Самый новый двоичный журнал был сгенерирован MySQL 5.7.5 или более ранней версией, и gtid_mode было ON для некоторых двоичных журналов, но OFF для самого нового двоичного журнала.

    • Было выполнено утверждение SET @@GLOBAL.gtid_purged в MySQL 5.7.7 или более ранней версии, а двоичный журнал, активный в момент утверждения SET @@GLOBAL.gtid_purged, ещё не был удалён.

    Если набор GTID вычислен неправильно в любой из ситуаций, он остаётся неверным, даже если сервер позже перезапускается с binlog_gtid_simple_recovery=FALSE. Если любая из этих ситуаций актуальна или может быть актуальной на сервере, установите binlog_gtid_simple_recovery=FALSE перед запуском или перезапуском сервера.

    Когда binlog_gtid_simple_recovery=FALSE установлено, метод вычисления gtid_executed и gtid_purged, как описано в переменной системы gtid_purged, изменяется на итерацию двоичных журналов следующим образом:

    • Вместо использования значения Previous_gtids_log_event и событий журнала GTID из самого нового двоичного файла журнала, вычисление для gtid_executed итерирует от самого нового двоичного файла журнала и использует значение Previous_gtids_log_event и любые события журнала GTID из первого двоичного файла журнала, где находит значение Previous_gtids_log_event. Если у последних двоичных журналов сервера нет событий журнала GTID, например, если gtid_mode=ON использовалось, но сервер позже был изменён на gtid_mode=OFF, этот процесс может занять много времени.

    • Вместо использования значения Previous_gtids_log_event из самого старого двоичного файла журнала, вычисление для gtid_purged итерирует от самого старого двоичного файла журнала и использует значение Previous_gtids_log_event из первого двоичного файла журнала, где находит либо непустое значение Previous_gtids_log_event, либо как минимум одно событие журнала GTID (указывая, что использование GTID начинается в этой точке). Если у более старых двоичных журналов сервера нет событий журнала GTID, например, если gtid_mode=ON было установлено только недавно на сервере, этот процесс может занять много времени.

  • enforce_gtid_consistency

    Формат командной строки --enforce-gtid-consistency[=value]
    Переменная системы enforce_gtid_consistency
    Область действия Глобальная
    Динамическая Да
    SET_VAR Применимо ли ограничение Нет
    Тип Перечисление
    Значение по умолчанию OFF
    Допустимые значения

    OFF

    ON

    WARN

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

    Значения, в которые можно настроить enforce_gtid_consistency, следующие:

    • OFF: все транзакции разрешены для нарушения согласованности GTID.

    • ON: ни одна транзакция не разрешена для нарушения согласованности GTID.

    • WARN: все транзакции разрешены для нарушения согласованности GTID, но в этом случае генерируется предупреждение.

    --enforce-gtid-consistency вступает в силу только в том случае, если двоичный журнал ведётся для инструкции. Если двоичный журнал отключён на сервере, или если инструкции не записаны в двоичный журнал, потому что они удалены фильтром, согласованность GTID не проверяется и не навязывается для инструкций, которые не записаны.

    Только инструкции, которые могут быть записаны с помощью безопасных для GTID инструкций, могут быть записаны, когда enforce_gtid_consistency установлено в ON, поэтому следующие операции нельзя использовать с этим параметром:

    • Инструкции CREATE TEMPORARY TABLE или DROP TEMPORARY TABLE внутри транзакций.

    • Транзакции или инструкции, которые обновляют как транзакционные, так и не транзакционные таблицы. Исключение состоит в том, что не транзакционные DML разрешены в той же транзакции или в той же инструкции, что и транзакционные DML, если все не транзакционные таблицы являются временными.

    • Инструкции CREATE TABLE ... SELECT поддерживаются для хранилищ данных, которые поддерживают атомарные DDL.

    Дополнительную информацию см. в разделе 19.1.3.7 «Ограничения на репликацию с GTID».

    Перед MySQL 5.7 и в ранних выпусках этой версии, булево enforce_gtid_consistency по умолчанию было OFF. Для поддержания совместимости с более ранними версиями, перечисление по умолчанию установлено в OFF, и установка --enforce-gtid-consistency без значения интерпретируется как установка значения в ON. Переменная также имеет несколько текстовых псевдонимов для значений: 0=OFF=FALSE, 1=ON=TRUE,2=WARN. Это отличается от других типов перечислений, но сохраняет совместимость с типом булевых переменных, использовавшимся в предыдущих выпусках. Эти изменения влияют на то, что возвращается переменной. Использование SELECT @@ENFORCE_GTID_CONSISTENCY, SHOW VARIABLES LIKE 'ENFORCE_GTID_CONSISTENCY' и SELECT * FROM INFORMATION_SCHEMA.VARIABLES WHERE 'VARIABLE_NAME' = 'ENFORCE_GTID_CONSISTENCY' возвращает текстовую форму, а не числовую. Это несовместимое изменение, так как @@ENFORCE_GTID_CONSISTENCY возвращает числовую форму для булевых значений, но возвращает текстовую форму для SHOW и схемы информации.

END_OF_DOCUMENT_MARKER
  • gtid_executed

    Переменная системы gtid_executed
    Область Глобальная
    Динамическая Нет
    SET_VAR Применяется подсказка Нет
    Тип Строка
    Единица измерения множество GTID

    При использовании в глобальной области эта переменная содержит представление набора всех транзакций, выполненных на сервере, и GTID, которые были заданы с помощью инструкции SET gtid_purged. Это то же значение, что и в столбце Executed_Gtid_Set результата выполнения команд SHOW BINARY LOG STATUS и SHOW REPLICA STATUS. Значение этой переменной — множество GTID, см. Наборы GTID для получения дополнительной информации.

    При запуске сервера @@GLOBAL.gtid_executed инициализируется. См. binlog_gtid_simple_recovery для получения дополнительной информации о том, как итерационно просматриваются бинарные логи для заполнения gtid_executed. Затем GTID добавляются в набор по мере выполнения транзакций или при выполнении какой-либо инструкции SET gtid_purged.

    Набор транзакций, которые могут быть найдены в бинарных логах в любой момент времени, равен GTID_SUBTRACT(@@GLOBAL.gtid_executed, @@GLOBAL.gtid_purged), то есть всем транзакциям в бинарном логе, которые еще не были удалены.

    Выполнение RESET BINARY LOGS AND GTIDS приводит к сбросу значения этой переменной до пустой строки. GTID не удаляются из этого набора иначе, кроме как при его очистке из-за RESET BINARY LOGS AND GTIDS.

  • gtid_executed_compression_period

    Формат командной строки --gtid-executed-compression-period=#
    Переменная системы gtid_executed_compression_period
    Область Глобальная
    Динамическая Да
    SET_VAR Применяется подсказка Нет
    Тип Целое число
    Значение по умолчанию 0
    Минимальное значение 0
    Максимальное значение 4294967295

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

    InnoDB транзакций записываются в таблицу mysql.gtid_executed отдельным процессом для транзакций, отличных от InnoDB. Если сервер содержит смесь транзакций InnoDB и не-InnoDB транзакций, сжатие, контролируемое этой переменной системы, мешает работе этого процесса и может значительно замедлить его. По этой причине с версии рекомендуется устанавливать gtid_executed_compression_period в 0.

    Все транзакции (независимо от хранилища данных) записываются в таблицу mysql.gtid_executed одним и тем же процессом, и значение по умолчанию gtid_executed_compression_period — 0.

    См. Сжатие таблицы mysql.gtid_executed для получения дополнительной информации.

  • gtid_mode

    Формат командной строки --gtid-mode=MODE
    Переменная системы gtid_mode
    Область Глобальная
    Динамическая Да
    SET_VAR Применяется подсказка Нет
    Тип Перечисление
    Значение по умолчанию OFF
    Допустимые значения

    OFF

    OFF_PERMISSIVE

    ON_PERMISSIVE

    ON

    Управляет включением ведения журнала на основе GTID и типом транзакций, которые могут содержаться в логах. Вам необходимо иметь права, достаточные для установки глобальных переменных системы. См. Раздел 7.1.9.1, «Права на переменные системы». enforce_gtid_consistency должна быть установлена в ON перед установкой gtid_mode=ON. Перед изменением этой переменной см. Раздел 19.1.4, «Изменение режима GTID на работающих серверах».

    Записываемые транзакции могут быть анонимными или использовать GTID. Анонимные транзакции полагаются на имя и позицию файла бинарного лога для идентификации конкретных транзакций. Транзакции GTID имеют уникальный идентификатор, используемый для ссылки на транзакции. Различные режимы:

    • OFF: Новые и реплицированные транзакции должны быть анонимными.

    • OFF_PERMISSIVE: Новые транзакции анонимные. Реплицированные транзакции могут быть либо анонимными, либо транзакциями GTID.

    • ON_PERMISSIVE: Новые транзакции — транзакции GTID. Реплицированные транзакции могут быть либо анонимными, либо транзакциями GTID.

    • ON: Новые и реплицированные транзакции должны быть транзакциями GTID.

    Переход от одного значения к другому может осуществляться только по одному шагу. Например, если gtid_mode в настоящее время имеет значение OFF_PERMISSIVE, можно перейти к OFF или ON_PERMISSIVE, но не к ON.

    Значения gtid_purged и gtid_executed сохраняются независимо от значения gtid_mode. Поэтому даже после изменения значения gtid_mode эти переменные содержат правильные значения.

  • gtid_next

    Переменная системы gtid_next
    Область действия Сеанс
    Динамическая Да
    SET_VAR Применяется подсказка Нет
    Тип Перечисление
    Значение по умолчанию AUTOMATIC
    Допустимые значения

    AUTOMATIC

    AUTOMATIC:<TAG>

    ANONYMOUS

    <UUID>:<NUMBER>

    <UUID>:<TAG>:<NUMBER>

    Эта переменная используется для указания, как получить следующий GTID (см. Раздел 19.1.3, «Репликация с глобальными идентификаторами транзакций»).

    Установка значения этой переменной для текущего сеанса — ограниченная операция. Пользователь сеанса должен иметь право REPLICATION_APPLIER (см. Раздел 19.3.3, «Проверка прав на репликацию») или права, достаточные для установки ограниченных переменных сеанса (см. Раздел 7.1.9.1, «Права на переменные системы»).

    gtid_next может принимать следующие значения:

    • AUTOMATIC: Использовать следующий автоматически сгенерированный глобальный идентификатор транзакции.

    • AUTOMATIC:TAG: Использовать следующий автоматически сгенерированный глобальный идентификатор транзакции с добавлением заданного пользователем тега в формате UUID:TAG:NUMBER.

      Тег должен соответствовать регулярному выражению [a-z_][a-z0-9_]{0,7}; другими словами, он должен соответствовать следующим правилам:

      • Тег должен состоять из 1-8 символов (включительно).

      • Первый символ может быть любой буквой a по z или символом подчеркивания (_).

      • Каждый из последующих символов может быть любой буквой a по z, цифрой 0 по 9 или символом подчеркивания (_).

      Установка gtid_next на источнике репликации на AUTOMATIC:TAG или UUID:TAG:NUMBER требует права TRANSACTION_GTID_TAG плюс как минимум одно из прав SYSTEM_VARIABLES_ADMIN, SESSION_VARIABLES_ADMIN или REPLICATION_APPLIER. Для REPLICATION_CHECKS_APPLIER это право также необходимо для установки gtid_next на любое из этих значений в дополнение к праву REPLICATION_APPLIER; эти права проверяются при запуске потока репликации.

    • ANONYMOUS: Транзакции не имеют глобальных идентификаторов и идентифицируются только по файлу и позиции.

    • Глобальный идентификатор транзакции в одном из форматов UUID:NUMBER или UUID:TAG:NUMBER.

    Точное количество вариантов, представленных выше, зависит от значения gtid_mode; см. Раздел 19.1.4.1, «Концепции режима репликации» для получения дополнительной информации. Установка этой переменной не имеет эффекта, если gtid_mode имеет значение OFF.

    После того, как эта переменная была установлена на UUID:NUMBER или UUID:TAG:NUMBER, и транзакция была подтверждена или отменена, перед выполнением любой другой инструкции необходимо выполнить явную команду SET gtid_next.

    DROP TABLE или DROP TEMPORARY TABLE завершается с явным сообщением об ошибке при использовании в сочетании с невременными таблицами и временными таблицами, или временными таблицами, использующими транзакционные хранилища, с временными таблицами, использующими нетранзакционные хранилища.

    Для получения дополнительной информации см. Переменную системы gtid_next а также Раздел 19.1.4, «Изменение режима GTID на онлайн-серверах».

  • gtid_owned

    Переменная системы gtid_owned
    Область действия Глобальная, Сеанс
    Динамическая Нет
    SET_VAR Применяется подсказка Нет
    Тип Строка
    Единица набор GTID

    Эта переменная для чтения, в основном используется для внутренних целей. Ее содержимое зависит от области действия.

    • При использовании в глобальной области действия gtid_owned содержит список всех используемых на сервере GTID с идентификаторами потоков, которые их владеют. Эта переменная в основном полезна для многопоточной реплики для проверки, не обрабатывается ли транзакция уже в другом потоке. Поток приложения получает право владения GTID транзакции на всё время обработки транзакции, поэтому @@global.gtid_owned отображает GTID и владельца на всё время обработки. Когда транзакция завершена (или отменена), поток приложения освобождает GTID.

    • При использовании в области действия сеанса gtid_owned содержит единственный GTID, который в данный момент используется и находится во владении этого сеанса. Эта переменная полезна в основном для тестирования и отладки использования GTID, когда клиент явно задает GTID для транзакции, установив gtid_next. В этом случае @@session.gtid_owned отображает GTID на всё время обработки транзакции клиентом, пока транзакция не будет завершена (или отменена). Когда клиент завершает обработку транзакции, переменная очищается. Если gtid_next=AUTOMATIC используется для сеанса, gtid_owned заполняется только в краткое время выполнения команды commit для транзакции, поэтому ее нельзя наблюдать из рассматриваемого сеанса, хотя она отображается, если @@global.gtid_owned прочитывается в нужный момент. Если у вас есть необходимость отслеживать GTID, которые обрабатываются клиентом в сеансе, вы можете включить отслеживание состояния сеанса, контролируемое переменной системы session_track_gtids.

  • gtid_purged

    Переменная системы gtid_purged
    Область действия Глобальная
    Динамическая Да
    SET_VAR Применимо для подсказок Нет
    Тип Строка
    Единица измерения набор GTID

    Глобальное значение переменной системы gtid_purged (@@GLOBAL.gtid_purged) — это набор GTID, содержащий GTID всех транзакций, которые были выполнены на сервере, но не существуют ни в одном бинарном журнале на сервере. gtid_purged является подмножеством gtid_executed. Следующие категории GTID находятся в gtid_purged:

    • GTID реплицированных транзакций, которые были выполнены с отключенной записью в бинарный журнал на реплике.

    • GTID транзакций, которые были записаны в бинарный журнал, который сейчас удалён.

    • GTID, которые были явно добавлены в набор с помощью оператора SET @@GLOBAL.gtid_purged.

    При запуске сервера глобальное значение gtid_purged инициализируется набором GTID. Сведения о том, как вычисляется этот набор GTID, можно найти в статье про переменную системы gtid_purged. Если на сервере присутствуют бинарные логи из MySQL 5.7.7 или более ранней версии, возможно, потребуется установить binlog_gtid_simple_recovery=FALSE в файле конфигурации сервера, чтобы получить правильное вычисление. Подробности о ситуациях, когда требуется это задание, можно найти в описании binlog_gtid_simple_recovery.

    Для установки gtid_purged необходимо иметь TRANSACTION_GTID_TAG.

    Выполнение оператора RESET BINARY LOGS AND GTIDS приводит к сбросу значения gtid_purged до пустой строки.

    Вы можете установить значение gtid_purged, чтобы записать на сервере, что транзакции в определённом наборе GTID были применены, хотя они не существуют ни в одном бинарном журнале на сервере. Пример использования — восстановление резервной копии одной или нескольких баз данных на сервере, но при отсутствии соответствующих бинарных журналов, содержащих транзакции на сервере.

    Важно

    GTID доступны только на экземпляре сервера до числа неотрицательных значений для 64-битного целого числа со знаком (263 - 1). Если вы установите значение gtid_purged близкое к этому пределу, последующие операции commit могут привести к исчерпанию GTID на сервере и выполнению действия, указанного в binlog_error_action. При приближении экземпляра сервера к пределу выдается сообщение об ошибке.

    Есть два способа установить значение gtid_purged. Вы можете либо заменить значение gtid_purged на ваш указанный набор GTID, либо добавить ваш указанный набор GTID к набору GTID, уже хранящемуся в gtid_purged. Если на сервере нет существующих GTID, например, на пустом сервере, на который вы восстанавливаете резервную копию существующей базы данных, оба метода дают одинаковый результат. Если вы восстанавливаете резервную копию, перекрывающую транзакции, уже присутствующие на сервере, например, заменяете повреждённую таблицу частичным дампом из исходного источника, созданного с помощью mysqldump (который включает GTID всех транзакций на сервере, даже если дамп частичный), используйте первый метод — замену значения gtid_purged. Если вы восстанавливаете резервную копию, не пересекающую транзакции, уже присутствующие на сервере, например, настраиваете реплику с несколькими источниками с помощью дампов с двух разных серверов, используйте второй метод — добавление к значению gtid_purged.

    • Чтобы заменить значение gtid_purged на ваш указанный набор GTID, используйте следующую команду:

      SET @@GLOBAL.gtid_purged = 'gtid_set'

      gtid_set должен быть надмножеством текущего значения gtid_purged и не должен пересекаться с gtid_subtract(gtid_executed,gtid_purged). Другими словами, новый набор GTID должен включать все GTID, которые уже были в gtid_purged, и не должен включать любые GTID из gtid_executed, которые ещё не были очищены. gtid_set также не может включать GTID, которые находятся в @@global.gtid_owned, то есть GTID транзакций, которые в настоящее время обрабатываются на сервере.

      Результатом является установка глобального значения gtid_purged равным gtid_set, а значение gtid_executed становится объединением gtid_set и предыдущего значения gtid_executed.

    • Чтобы добавить ваш указанный набор GTID к gtid_purged, используйте следующую команду со знаком плюс (+) перед набором GTID:

      SET @@GLOBAL.gtid_purged = '+gtid_set'

      gtid_set не должен пересекаться с текущим значением gtid_executed. Другими словами, новый набор GTID не должен включать никакие GTID из gtid_executed, в том числе транзакции, которые уже присутствуют в gtid_purged. gtid_set также не может включать GTID, которые находятся в @@global.gtid_owned, то есть GTID транзакций, которые в настоящее время обрабатываются на сервере.

      Результатом является добавление gtid_set как к gtid_executed, так и к gtid_purged.

Примечание

Если на сервере присутствуют бинарные логи из MySQL 5.7.7 или более ранней версии (например, после обновления старого сервера до MySQL 8.4), после выполнения оператора SET @@GLOBAL.gtid_purged, возможно, потребуется установить binlog_gtid_simple_recovery=FALSE в файле конфигурации сервера перед перезапуском сервера, в противном случае gtid_purged может быть вычислено неправильно. Подробности о ситуациях, когда требуется это задание, можно найти в описании binlog_gtid_simple_recovery.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/replication-options-gtids.html

Spec-Zone.ru

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