Spec-Zone.ru › MySQL 5.7

16.1.6.5 Переменные системы для системы глобальных идентификаторов транзакций

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

  • binlog_gtid_simple_recovery

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

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

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

    С 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 до запуска или перезапуска сервера. Для проверки второй ситуации, если вы используете MySQL 5.7.7 или более раннюю версию, после выполнения оператора SET @@GLOBAL.gtid_purged запишите текущее имя файла двоичного журнала, которое можно проверить с помощью SHOW MASTER STATUS. Если сервер перезапускается до того, как этот файл был очищен, вам следует установить 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 было установлено только недавно на сервере, этот процесс может занять много времени.

    В версии MySQL 5.7.5 эта переменная была добавлена как simplified_binlog_gtid_recovery, а в версии MySQL 5.7.6 она была переименована в binlog_gtid_simple_recovery.

  • enforce_gtid_consistency

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

    OFF

    ON

    WARN

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

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

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

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

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

    Когда enforce_gtid_consistency установлено в ON, в журнал могут записываться только операторы, которые могут быть записаны с использованием безопасных для GTID операторов. Следовательно, эти операции нельзя использовать с этим параметром:

    • операторы CREATE TABLE ... SELECT

    • операторы CREATE TEMPORARY TABLE или DROP TEMPORARY TABLE внутри транзакций

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

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

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

    До версии MySQL 5.7.6 булевое значение enforce_gtid_consistency имело значение по умолчанию OFF. Для обеспечения совместимости с предыдущими версиями в MySQL 5.7.6 перечисление по умолчанию установлено на 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
    Область действия Глобальная
    Динамическая Нет
    Тип Строка
    Единица измерения множество GTID

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

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

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

    Выполнение RESET MASTER приводит к сбросу глобального значения (но не сессионного значения) этой переменной до пустой строки. GTID не удаляются из этого набора, за исключением случаев, когда набор очищается из-за RESET MASTER.

    До MySQL 5.7.7 эта переменная также могла использоваться с областью действия сессии, где она содержала представление множества транзакций, записываемых в кеш в текущей сессии. Область действия сессии была устаревшей в MySQL 5.7.7.

  • gtid_executed_compression_period

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

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

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

    Эта переменная была добавлена в MySQL версии 5.7.5 как executed_gtids_compression_period и переименована в MySQL версии 5.7.6 в gtid_executed_compression_period.

  • gtid_mode

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

    OFF

    OFF_PERMISSIVE

    ON_PERMISSIVE

    ON

    Управляет включением ведения журнала на основе GTID и типом транзакций, которые могут содержать журналы. До MySQL 5.7.6 эта переменная была только для чтения и устанавливалась с помощью --gtid-mode только при запуске сервера. До MySQL 5.7.5 запуск сервера с --gtid-mode=ON требовал, чтобы сервер также запускался с параметрами --log-bin и --log-slave-updates. С MySQL 5.7.5 это требование больше не является обязательным. См. mysql.gtid_executed Table.

    MySQL 5.7.6 позволяет динамически изменять эту переменную. Вам необходимо иметь достаточные привилегии для изменения глобальных переменных системы. См. Раздел 5.1.8.1, “Privileges for System Variables”. enforce_gtid_consistency должно быть установлено в ON, прежде чем вы сможете изменить gtid_mode=ON. Перед изменением этой переменной см. Раздел 16.1.4, “Изменение режимов репликации на онлайн-серверах”.

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

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

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

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

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

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

    В MySQL 5.7.6 и более поздних версиях значения gtid_purged и gtid_executed сохраняются независимо от значения gtid_mode. Поэтому даже после изменения значения gtid_mode эти переменные содержат правильные значения. В MySQL 5.7.5 и более ранних версиях значения gtid_purged и gtid_executed не сохраняются при изменении gtid_mode=OFF. Следовательно, после изменения gtid_mode на OFF, после удаления всех двоичных журналов, содержащих GTID, значения этих переменных теряются.

  • gtid_next

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

    AUTOMATIC

    ANONYMOUS

    <UUID>:<NUMBER>

    Эта переменная используется для указания того, как получать следующий GTID.

    Установка значения этой переменной в сеансе — ограниченная операция. Пользователь сеанса должен иметь достаточные привилегии для установки ограниченных переменных сеанса. См. Раздел 5.1.8.1, «Привилегии переменных системы».

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

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

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

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

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

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

    В MySQL 5.7.5 и более поздних версиях DROP TABLE или DROP TEMPORARY TABLE завершается с явным сообщением об ошибке при использовании в сочетании с невременными таблицами и временными таблицами, или временными таблицами, использующими транзакционные хранилища, с временными таблицами, использующими не транзакционные хранилища. В MySQL 5.7.5 и более ранних версиях, когда GTID были включены, но gtid_next не был AUTOMATIC, DROP TABLE не работал правильно, если использовался с одним из этих сочетаний таблиц. (Ошибка #17620053)

    В MySQL 5.7.1 вы не можете выполнить ни одну из команд CHANGE MASTER TO, START SLAVE, STOP SLAVE, REPAIR TABLE, OPTIMIZE TABLE, ANALYZE TABLE, CHECK TABLE, CREATE SERVER, ALTER SERVER, DROP SERVER, CACHE INDEX, LOAD INDEX INTO CACHE, FLUSH, или RESET, когда gtid_next установлено на любое значение, кроме AUTOMATIC; в таких случаях команда завершается с ошибкой. Такие команды не запрещены в MySQL 5.7.2 и более поздних версиях. (Ошибка #16062608, Ошибка #16715809, Ошибка #69045) (Ошибка #16062608)

  • gtid_owned

    Переменная системы gtid_owned
    Область Глобальная, Сеанс
    Динамическая Нет
    Тип Строка
    Единица измерения множество 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
    Область действия Глобальная
    Динамическая Да
    Тип Строка
    Единица измерения множество 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.

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

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

    Важно

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

    В MySQL 5.7 можно обновить значение gtid_purged только тогда, когда gtid_executed является пустой строкой, и поэтому gtid_purged также пуста. Это происходит либо при отсутствии предыдущего запуска репликации, либо при отсутствии предыдущего использования GTID в репликации. До MySQL 5.7.6 gtid_purged также можно было установить только когда gtid_mode=ON было задано определённым образом. В MySQL 5.7.6 и более поздних версиях gtid_purged можно задать независимо от значения gtid_mode.

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

    SET @@GLOBAL.gtid_purged = 'gtid_set'
    Примечание

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

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

Spec-Zone.ru

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