19.1.6.5 Переменные системы GTID
Переменные системы 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 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[=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. Это отличается от других типов перечислений, но сохраняет совместимость с типом 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Область Глобальная Динамическая Нет 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заполняется только в течение короткого времени во время выполнения оператора подтверждения транзакции, поэтому его нельзя наблюдать из соответствующего сеанса, хотя он отображается, если@@global.gtid_ownedсчитывается в нужное время. Если вам нужно отслеживать GTID, которые обрабатываются клиентом в сеансе, вы можете включить отслеживание состояния сеанса, управляемое переменной системыsession_track_gtids.
-
Переменная системы 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.