Documentation Home

17.1.6.5 全局事务 ID 系统变量

本节中描述的 MySQL 服务器系统变量用于监视和控制全局事务标识符 (GTID)。有关其他信息,请参阅 第 17.1.3 节,“使用全局事务标识符进行复制”

  • binlog_gtid_simple_recovery

    命令行格式 --binlog-gtid-simple-recovery[={OFF|ON}]
    系统变量 binlog_gtid_simple_recovery
    范围 全球的
    动态的
    SET_VAR提示适用
    类型 布尔值
    默认值 ON

    此变量控制在 MySQL 启动或重新启动时搜索 GTID 期间如何迭代二进制日志文件。

    当 时 binlog_gtid_simple_recovery=TRUE,这是 MySQL 8.0 中的默认值, 在启动时根据 最新和最旧的二进制日志文件中的值计算gtid_executed和 的值。有关计算的说明,请参阅 系统变量。此设置在服务器重启期间仅访问两个二进制日志文件。如果服务器上的所有二进制日志都是使用 MySQL 5.7.8 或更高版本生成的, 则始终可以安全使用。 gtid_purgedPrevious_gtids_log_eventgtid_purgedbinlog_gtid_simple_recovery=TRUE

    如果服务器上存在任何来自 MySQL 5.7.7 或更早版本的二进制日志(例如,在将旧服务器升级到 MySQL 8.0 之后), 则在以下两种情况下, binlog_gtid_simple_recovery=TRUE可能 会错误地初始化: gtid_executedgtid_purged

    • 最新的二进制日志是由MySQL 5.7.5或更早版本生成的,gtid_mode 针对ON部分二进制日志,但 OFF针对的是最新的二进制日志。

    • 在 MySQL 5.7.7 或更早版本上发出了一条SET @@GLOBAL.gtid_purged语句,并且在该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 日志事件(表明 GTID 的使用从那时开始)。如果服务器的旧二进制日志文件没有 GTID 日志事件,例如,如果 最近才在服务器上设置,则此过程可能需要很长时间。 gtid_purgedPrevious_gtids_log_eventPrevious_gtids_log_eventgtid_mode=ON

  • enforce_gtid_consistency

    命令行格式 --enforce-gtid-consistency[=value]
    系统变量 enforce_gtid_consistency
    范围 全球的
    动态的 是的
    SET_VAR提示适用
    类型 枚举
    默认值 OFF
    有效值

    OFF

    ON

    WARN

    根据此变量的值,服务器通过仅允许执行可以使用 GTID 安全记录的语句来强制执行 GTID 一致性。在启用基于 GTID 的复制之前, 必须 将此变量设置为 。ON

    enforce_gtid_consistency可以配置为 的值 是:

    • OFF:允许所有事务违反 GTID 一致性。

    • ON: 不允许任何事务违反 GTID 一致性。

    • WARN:允许所有事务违反 GTID 一致性,但在这种情况下会生成警告。

    --enforce-gtid-consistency仅当对语句进行二进制日志记录时才生效。如果在服务器上禁用了二进制日志记录,或者如果语句由于被过滤器删除而未写入二进制日志,则不会检查或强制执行未记录的语句的 GTID 一致性。

    enforce_gtid_consistency当设置为时, 只能记录可以使用 GTID 安全语句记录 的语句ON,因此此处列出的操作不能与此选项一起使用:

    有关详细信息,请参阅 第 17.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_CONSISTENCYSHOW VARIABLES LIKE 'ENFORCE_GTID_CONSISTENCY'SELECT * FROM INFORMATION_SCHEMA.VARIABLES WHERE 'VARIABLE_NAME' = 'ENFORCE_GTID_CONSISTENCY', 都返回文本形式,而不是数字形式。这是一个不兼容的更改,因为@@ENFORCE_GTID_CONSISTENCY返回布尔值的数字形式,但返回 SHOW信息模式的文本形式。

  • gtid_executed

    系统变量 gtid_executed
    范围 全球的
    动态的
    SET_VAR提示适用
    类型 细绳
    单元 一组 GTID

    当与全局范围一起使用时,此变量包含在服务器上执行的所有事务的集合的表示以及已由 语句设置的 GTID。这与和 的输出中列 的值相同 。此变量的值是一个 GTID 集,有关更多信息,请参阅 GTID 集SET gtid_purgedExecuted_Gtid_SetSHOW MASTER STATUSSHOW REPLICA STATUS

    当服务器启动时, @@GLOBAL.gtid_executed被初始化。binlog_gtid_simple_recovery 有关如何迭代二进制日志以填充的更多信息,请参见 gtid_executed。然后在执行事务时或执行任何语句 时将 GTID 添加到集合中 。SET gtid_purged

    在任何给定时间可以在二进制日志中找到的事务集等于 GTID_SUBTRACT(@@GLOBAL.gtid_executed, @@GLOBAL.gtid_purged);也就是说,二进制日志中所有尚未被清除的事务。

    发出RESET MASTER导致此变量的全局值(但不是会话值)重置为空字符串。除了由于 RESET MASTER.

    在一些旧版本中,这个变量也可以与会话范围一起使用,其中它包含在当前会话中写入缓存的一组事务的表示。会话范围现已弃用。

  • gtid_executed_compression_period

    命令行格式 --gtid-executed-compression-period=#
    系统变量 gtid_executed_compression_period
    范围 全球的
    动态的 是的
    SET_VAR提示适用
    类型 整数
    默认值(≥ 8.0.23) 0
    默认值(≤ 8.0.22) 1000
    最小值 0
    最大值 4294967295

    mysql.gtid_executed每次处理这么多事务时 压缩表。在服务器上启用二进制日志记录时,不使用这种压缩方法,而是 mysql.gtid_executed在每次二进制日志轮换时压缩表。当在服务器上禁用二进制日志记录时,压缩线程会休眠直到执行了指定数量的事务,然后唤醒以执行 mysql.gtid_executed表的压缩。将这个系统变量的值设置为0意味着线程永不唤醒,所以不使用这种显式的压缩方式。相反,压缩会根据需要隐式发生。

    从 MySQL 8.0.17 开始,事务由一个单独的进程InnoDB写入表,而不是非 事务。如果服务器混合了 事务和非事务,则此系统变量控制的压缩会干扰此进程的工作,并可能显着降低速度。因此,从该版本开始,建议您设置 为 0。 mysql.gtid_executedInnoDBInnoDBInnoDBgtid_executed_compression_period

    从MySQL 8.0.23开始,InnoDB和非InnoDB事务同进程写入 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 的日志记录以及日志可以包含的事务类型。您必须具有足够的权限才能设置全局系统变量。请参阅 第 5.1.9.1 节,“系统变量权限”enforce_gtid_consistency必须设置为ON才能设置 gtid_mode=ON。在修改此变量之前,请参阅 第 17.1.4 节,“更改在线服务器上的 GTID 模式”

    记录的事务可以是匿名的或使用 GTID。匿名交易依靠二进制日志文件和位置来识别特定交易。GTID 事务具有用于引用事务的唯一标识符。不同的模式是:

    • OFF:新交易和复制交易都必须是匿名的。

    • OFF_PERMISSIVE: 新交易是匿名的。复制事务可以是匿名事务或 GTID 事务。

    • ON_PERMISSIVE: 新事务是 GTID 事务。复制事务可以是匿名事务或 GTID 事务。

    • ON:新事务和复制事务都必须是 GTID 事务。

    从一个值到另一个值的更改一次只能是一个步骤。例如,如果 gtid_mode当前设置为 OFF_PERMISSIVE,则可以更改为 OFFON_PERMISSIVE但不能更改为ON

    无论 的值如何, gtid_purged和 的 值都是持久的。因此,即使在更改 的值之后 ,这些变量仍包含正确的值。 gtid_executedgtid_modegtid_mode

  • gtid_next

    系统变量 gtid_next
    范围 会议
    动态的 是的
    SET_VAR提示适用
    类型 枚举
    默认值 AUTOMATIC
    有效值

    AUTOMATIC

    ANONYMOUS

    UUID:NUMBER

    该变量用于指定是否以及如何获取下一个 GTID。

    设置这个系统变量的会话值是一个受限的操作。会话用户必须具有 REPLICATION_APPLIER权限(请参阅第 17.3.3 节,“复制权限检查”),或足以设置受限会话变量的权限(请参阅 第 5.1.9.1 节,“系统变量权限”)。

    gtid_next可以采用以下任何值:

    • AUTOMATIC:使用下一个自动生成的全局事务 ID。

    • ANONYMOUS: 事务没有全局标识符,仅由文件和位置标识。

    • 格式 为UUID: 的全局事务 ID 。NUMBER

    上述选项中哪些选项有效取决于 的设置gtid_mode,请参阅 第 17.1.4.1 节,“复制模式概念”以获取更多信息。gtid_mode如果是 ,则设置此变量无效 OFF

    将此变量设置为 UUID:NUMBER并提交或回滚事务后,SET GTID_NEXT必须在任何其他语句之前再次发出显式语句。

    DROP TABLEDROP TEMPORARY TABLE在非临时表与临时表的组合上使用时失败并出现显式错误,或者在使用事务存储引擎的临时表与使用非事务存储引擎的临时表的组合上使用时失败。

  • gtid_owned

    系统变量 gtid_owned
    范围 全局,会话
    动态的
    SET_VAR提示适用
    类型 细绳
    单元 一组 GTID

    此只读变量主要供内部使用。它的内容取决于它的范围。

    • 当与全局范围一起使用时, gtid_owned保存服务器上当前正在使用的所有 GTID 的列表,以及拥有它们的线程的 ID。此变量主要用于多线程副本检查事务是否已在另一个线程上应用。应用程序线程在处理事务的所有时间都拥有事务的 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 位于 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接近此限制的数字,则后续提交可能会导致服务器用完 GTID 并采取 指定的操作 binlog_error_action。从 MySQL 8.0.23 开始,当服务器实例接近限制时会发出警告消息。

    从 MySQL 8.0 开始,有两种方式设置 gtid_purged. 您可以将 的值替换为 gtid_purged您指定的 GTID 集,也可以将您指定的 GTID 集附加到已经由 持有的 GTID 集 gtid_purged。如果服务器没有现有的 GTID,例如您使用现有数据库的备份配置的空服务器,则两种方法的结果相同。如果您正在恢复与服务器上已有的事务重叠的备份,例如用来自使用mysqldump生成的源的部分转储替换损坏的表(其中包括服务器上所有事务的 GTID,即使转储是部分的),使用第一种方法替换gtid_purged. 如果要还原与服务器上已有的事务不相交的备份,例如使用来自两个不同服务器的转储来配置多源副本,请使用第二种方法添加gtid_purged.

    • 要用您指定的 GTID 集替换 的值, gtid_purged请使用以下语句:

      SET @@GLOBAL.gtid_purged = 'gtid_set'

      gtid_set必须是 的当前值的超集 gtid_purged,并且不能与 相交 gtid_subtract(gtid_executed,gtid_purged)。换句话说,新的 GTID 集 必须包含任何已经在 中 的 GTID gtid_purged,并且 不得gtid_executed包含 尚未清除的任何 GTID 。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_purgedgtid_set也不能包括 中的任何 GTID,@@global.gtid_owned即当前正在服务器上处理的事务的 GTID。

      结果是gtid_set被添加到gtid_executedgtid_purged中。

笔记

如果服务器上存在任何来自 MySQL 5.7.7 或更早版本的二进制日志(例如,在将旧服务器升级到 MySQL 8.0 之后),在发出SET @@GLOBAL.gtid_purged语句后,您可能需要 binlog_gtid_simple_recovery=FALSE 在重新启动之前在服务器的配置文件中进行设置服务器,否则gtid_purged可能计算不正确。binlog_gtid_simple_recovery需要该设置的情况 详见说明 。