19.1.6.5 Переменные системы Global Transaction ID
Переменные системы MySQL Server, описанные в этом разделе, используются для мониторинга и управления глобальными идентификаторами транзакций (GTID). Дополнительную информацию см. в разделе 19.1.3 «Репликация с глобальными идентификаторами транзакций».
-
Формат командной строки --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[=value]Переменная системы enforce_gtid_consistencyОбласть действия Глобальная Динамическая Да SET_VARПрименимо ли ограничениеНет Тип Перечисление Значение по умолчанию OFFДопустимые значения OFFONWARNВ зависимости от значения этой переменной сервер навязывает согласованность 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и схемы информации.
-
Переменная системы gtid_executedОбласть Глобальная Динамическая Нет SET_VARПрименяется подсказкаНет Тип Строка Единица измерения множество GTID При использовании в глобальной области эта переменная содержит представление набора всех транзакций, выполненных на сервере, и GTID, которые были заданы с помощью инструкции
SETgtid_purged. Это то же значение, что и в столбцеExecuted_Gtid_Setрезультата выполнения командSHOW BINARY LOG STATUSиSHOW REPLICA STATUS. Значение этой переменной — множество GTID, см. Наборы GTID для получения дополнительной информации.При запуске сервера
@@GLOBAL.gtid_executedинициализируется. См.binlog_gtid_simple_recoveryдля получения дополнительной информации о том, как итерационно просматриваются бинарные логи для заполненияgtid_executed. Затем GTID добавляются в набор по мере выполнения транзакций или при выполнении какой-либо инструкцииSETgtid_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=MODEПеременная системы gtid_modeОбласть Глобальная Динамическая Да SET_VARПрименяется подсказкаНет Тип Перечисление Значение по умолчанию OFFДопустимые значения OFFOFF_PERMISSIVEON_PERMISSIVEONУправляет включением ведения журнала на основе 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Область действия Сеанс Динамическая Да SET_VARПрименяется подсказкаНет Тип Перечисление Значение по умолчанию AUTOMATICДопустимые значения AUTOMATICAUTOMATIC:<TAG>ANONYMOUS<UUID>:<NUMBER><UUID>:<TAG>:<NUMBER>Эта переменная используется для указания, как получить следующий GTID (см. Раздел 19.1.3, «Репликация с глобальными идентификаторами транзакций»).
Установка значения этой переменной для текущего сеанса — ограниченная операция. Пользователь сеанса должен иметь право
REPLICATION_APPLIER(см. Раздел 19.3.3, «Проверка прав на репликацию») или права, достаточные для установки ограниченных переменных сеанса (см. Раздел 7.1.9.1, «Права на переменные системы»).gtid_nextможет принимать следующие значения:AUTOMATIC: Использовать следующий автоматически сгенерированный глобальный идентификатор транзакции.-
AUTOMATIC:: Использовать следующий автоматически сгенерированный глобальный идентификатор транзакции с добавлением заданного пользователем тега в формате UUID:TAGTAG:NUMBER.Тег должен соответствовать регулярному выражению
[a-z_][a-z0-9_]{0,7}; другими словами, он должен соответствовать следующим правилам:Тег должен состоять из 1-8 символов (включительно).
Первый символ может быть любой буквой
aпоzили символом подчеркивания (_).Каждый из последующих символов может быть любой буквой
aпоz, цифрой0по9или символом подчеркивания (_).
Установка
gtid_nextна источнике репликации наAUTOMATIC:илиTAGтребует праваUUID:TAG:NUMBERTRANSACTION_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:NUMBERSET gtid_next.DROP TABLEилиDROP TEMPORARY TABLEзавершается с явным сообщением об ошибке при использовании в сочетании с невременными таблицами и временными таблицами, или временными таблицами, использующими транзакционные хранилища, с временными таблицами, использующими нетранзакционные хранилища.Для получения дополнительной информации см. Переменную системы gtid_next а также Раздел 19.1.4, «Изменение режима GTID на онлайн-серверах».
-
Переменная системы 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Область действия Глобальная Динамическая Да 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.