Spec-Zone.ru › MySQL 9.2

19.1.6.5 Переменные системы GTID

Переменные системы 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 9.2), с 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. Это отличается от других типов перечислений, но сохраняет совместимость с типом boolean, используемым в предыдущих выпусках. Эти изменения влияют на то, что возвращает переменная. Использование SELECT @@ENFORCE_GTID_CONSISTENCY, SHOW VARIABLES LIKE 'ENFORCE_GTID_CONSISTENCY' и SELECT * FROM INFORMATION_SCHEMA.VARIABLES WHERE 'VARIABLE_NAME' = 'ENFORCE_GTID_CONSISTENCY' возвращает текстовую форму, а не числовую. Это несовместимое изменение, так как @@ENFORCE_GTID_CONSISTENCY возвращает числовую форму для boolean, но возвращает текстовую форму для SHOW и схемы информации.

  • 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 заполняется только в течение короткого времени во время выполнения оператора подтверждения транзакции, поэтому его нельзя наблюдать из соответствующего сеанса, хотя он отображается, если @@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_purged содержатся следующие категории GTID:

    • 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 вблизи этого предела, последующие операции завершения могут привести к тому, что сервер исчерпает 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 9.2), после выдачи оператора 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-9.2-en/replication-options-gtids.html

Spec-Zone.ru

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