Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

19.1.6.5 全局事务ID系统变量

本节描述的MySQL Server系统变量用于监控和控制全局事务标识符(GTIDs)。有关更多信息,请参阅第19.1.3节,“使用全局事务标识符的复制”

  • binlog_gtid_simple_recovery

    Command-Line Format --binlog-gtid-simple-recovery[={OFF|ON}]
    System Variable binlog_gtid_simple_recovery
    Scope 全局
    Dynamic
    SET_VAR Hint Applies
    Type 布尔值
    Default Value ON

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

    binlog_gtid_simple_recovery=TRUE(默认值)时,gtid_executedgtid_purged的值将在启动时根据最新和最旧的二进制日志文件中的Previous_gtids_log_event值计算。有关计算的描述,请参阅gtid_purged系统变量。该设置在服务器重新启动时仅访问两个二进制日志文件。如果服务器上的所有二进制日志都是使用MySQL 5.7.8或更高版本生成的,binlog_gtid_simple_recovery=TRUE始终可以安全地使用。

    如果服务器上存在来自MySQL 5.7.7或更早版本的二进制日志(例如,在升级旧服务器到MySQL 8.3时),则binlog_gtid_simple_recovery=TRUE可能会导致gtid_executedgtid_purged在以下两种情况下初始化不正确:

    • 最新的二进制日志是由MySQL 5.7.5或更早版本生成的,而gtid_mode曾经为ON,但最新的二进制日志为OFF

    • 在MySQL 5.7.7或更早版本上执行了SET @@GLOBAL.gtid_purged语句,而在执行该语句时活动的二进制日志尚未被清除。

    如果在这两种情况下计算出错误的GTID集,即使服务器后来以binlog_gtid_simple_recovery=FALSE重新启动,GTID集仍将保持不正确。如果这两种情况适用或可能适用服务器,请在启动或重新启动服务器之前将binlog_gtid_simple_recovery设置为FALSE

    binlog_gtid_simple_recovery=FALSE时,gtid_executedgtid_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

    Command-Line Format --enforce-gtid-consistency[=value]
    System Variable enforce_gtid_consistency
    Scope 全局
    Dynamic
    SET_VAR Hint Applies
    Type 枚举
    Default Value OFF
    Valid Values

    OFF

    ON

    WARN

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

    可以将 enforce_gtid_consistency 配置为以下值:

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

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

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

    --enforce-gtid-consistency 只在语句被记录到二进制日志时生效。如果二进制日志记录被禁用或语句被过滤器删除,那么 GTID 一致性不会被检查或强制。

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

    • CREATE TEMPORARY TABLEDROP TEMPORARY TABLE 语句在事务中。

    • 事务或语句更新了事务和非事务表。有一个例外,即非事务 DML 在同一事务或同一语句中与事务 DML 一起使用,如果所有 非事务 表都是临时的。

    • CREATE TABLE ... SELECT 语句支持 atomic DDL 的存储引擎。

    有关更多信息,请参阅 第 19.1.3.7 节,“GTID 复制限制”

    在 MySQL 5.7 及更早版本中,以及在该版本系列的早期版本中,布尔值 enforce_gtid_consistency 默认为 OFF。为了与这些早期版本保持兼容性,该枚举默认为 OFF,并且设置 --enforce-gtid-consistency 而不带值将被解释为将值设置为 ON。该变量还具有多个文本别名:0=OFF=FALSE1=ON=TRUE2=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

    System Variable gtid_executed
    Scope 全局
    Dynamic
    SET_VAR Hint Applies
    Type 字符串
    Unit GTID 集合

    当使用全局作用域时,该变量包含服务器上执行的所有事务的表示形式和 GTID 集合,该集合是通过 SET gtid_purged 语句设置的。这与 SHOW BINARY LOG STATUSSHOW REPLICA STATUSExecuted_Gtid_Set 列的值相同。该变量的值是一个 GTID 集合,更多信息请参阅 GTID 集合

    当服务器启动时,@@GLOBAL.gtid_executed 被初始化。更多信息请参阅 binlog_gtid_simple_recovery,了解二进制日志如何被迭代以填充 gtid_executed。然后,GTIDs 将被添加到集合中,因为事务被执行,或者如果任何 SET gtid_purged 语句被执行。

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

    发出 RESET BINARY LOGS AND GTIDS 将导致该变量被重置为空字符串。GTIDs 不会从该集合中删除,除非是由于 RESET BINARY LOGS AND GTIDS

  • gtid_executed_compression_period

    Command-Line Format --gtid-executed-compression-period=#
    System Variable gtid_executed_compression_period
    Scope 全局
    Dynamic
    SET_VAR Hint Applies
    Type 整数
    Default Value 0
    Minimum Value 0
    Maximum Value 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

    Command-Line Format --gtid-mode=MODE
    System Variable gtid_mode
    Scope 全局
    Dynamic
    SET_VAR Hint Applies
    Type 枚举
    Default Value OFF
    Valid Values

    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,那么可以更改为 OFFON_PERMISSIVE,但不能更改为 ON

    无论 gtid_mode 的值如何,gtid_purgedgtid_executed 的值将保持不变。因此,即使更改了 gtid_mode 的值,这些变量也将包含正确的值。

  • gtid_next

    System Variable gtid_next
    Scope 会话
    Dynamic
    SET_VAR Hint Applies
    Type 枚举
    Default Value 自动
    Valid Values

    自动

    自动:标签

    匿名

    UUIDNUMBER

    UUID标签NUMBER

    该变量用于指定是否和如何获取下一个 GTID(参见 第 19.1.3 节,“使用全局事务标识符的复制”)。

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

    gtid_next 可以取以下任何值:

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

    • 自动:标签:使用下一个自动生成的全局事务 ID,并添加一个用户指定的标签,以 UUID:标签:NUMBER 格式。

      标签必须匹配正则表达式 [a-z_][a-z0-9_]{0,7};换言之,它必须符合以下规则:

      • 标签必须由 1-8 个字符(包括)组成。

      • 第一个字符可以是任何字母 az,或下划线 (_)。

      • 每个剩余字符可以是任何字母 az,数字 09,或下划线 (_)。

      gtid_next 设置为 自动:标签UUID:标签:NUMBER 需要 TRANSACTION_GTID_TAG 权限加上至少一个 SYSTEM_VARIABLES_ADMINSESSION_VARIABLES_ADMINREPLICATION_APPLIER 权限。

    • 匿名:事务没有全局标识符,只是通过文件和位置标识。

    • 一个全局事务 ID,以 UUID:NUMBERUUID:标签:NUMBER 格式。

    哪些选项是有效的取决于 gtid_mode 的设置;参见 第 19.1.4.1 节,“复制模式概念” 以获取更多信息。设置该变量对 gtid_modeOFF 时无效。

    在将该变量设置为 UUID:NUMBERUUID:标签:NUMBER,并且事务已经提交或回滚后,必须再次发出明确的 SET gtid_next 语句,然后才能执行其他语句。

    DROP TABLEDROP TEMPORARY TABLE 在使用于非临时表和临时表的组合时,或者在使用事务存储引擎的临时表和非事务存储引擎的临时表时,会失败并显示明确的错误。

    有关更多信息,请参阅gtid_next 系统变量,以及第 19.1.4 节,“在线服务器上的 GTID 模式更改”

  • gtid_owned

    System Variable gtid_owned
    Scope 全局、会话
    Dynamic
    SET_VAR Hint Applies
    Type 字符串
    Unit GTID 集合

    该只读变量主要用于内部使用。其内容取决于其作用域。

    • 当使用全局作用域时,gtid_owned 持有当前服务器上使用的所有 GTID 的列表,包括线程所有者的 ID。这主要用于多线程副本检查事务是否已经在另一个线程上应用。@@global.gtid_owned 显示 GTID 和所有者,直到事务被提交(或回滚)。

    • 当使用会话作用域时,gtid_owned 持有当前会话使用的单个 GTID。这主要用于测试和调试 GTID 使用时,客户端明确分配了事务的 GTID 通过设置 gtid_next。在这种情况下,@@session.gtid_owned 显示 GTID,直到事务被提交(或回滚)。当客户端完成事务处理时,变量将被清除。如果使用 gtid_next=AUTOMATICgtid_owned 只在事务提交语句执行期间短暂填充,因此无法从关心的会话中观察到,尽管它在 @@global.gtid_owned 中列出。如果您需要跟踪客户端在会话中处理的 GTID,可以启用由 session_track_gtids 系统变量控制的会话状态跟踪器。

  • gtid_purged

    System Variable gtid_purged
    Scope 全局
    Dynamic
    SET_VAR Hint Applies
    Type 字符串
    Unit GTID 集合

    全局变量 gtid_purged 的值(@@GLOBAL.gtid_purged)是一个 GTID 集合,包含服务器上提交的事务的 GTID,但不在服务器上的任何二进制日志文件中。gtid_purgedgtid_executed 的子集。以下类别的 GTID 在 gtid_purged 中:

    • 复制事务的 GTID,它们是在副本上提交的,但二进制日志记录被禁用。

    • 事务的 GTID,它们被写入了现在已经被清除的二进制日志文件中。

    • 通过语句 SET @@GLOBAL.gtid_purged 明确添加到集合中的 GTID。

    服务器启动时,全局变量 gtid_purged 的值被初始化为一个 GTID 集合。有关如何计算该 GTID 集合的信息,请参阅 gtid_purged 系统变量。如果服务器上存在来自 MySQL 5.7.7 或更早版本的二进制日志,您可能需要在服务器配置文件中设置 binlog_gtid_simple_recovery=FALSE,以生成正确的计算结果。请参阅 binlog_gtid_simple_recovery 的描述,以了解需要这种设置的情况。

    发出 RESET BINARY LOGS AND GTIDS 导致 gtid_purged 的值被重置为空字符串。

    您可以设置 gtid_purged 的值,以便在服务器上记录某个 GTID 集中的事务已经被应用,尽管它们不在服务器上的任何二进制日志中。例如,当您从备份中恢复一个或多个数据库到服务器上,但您没有包含这些事务的相关二进制日志时。

    Important

    GTIDs 只有在服务器实例上可用,直到 signed 64 位整数的非负值的数量(263 - 1)。如果您将 gtid_purged 的值设置为接近该限制的数字,后续的提交可能会导致服务器耗尽 GTIDs 并执行 binlog_error_action 指定的操作。当服务器实例接近该限制时,会发出警告消息。

    有两种方法可以设置 gtid_purged 的值。您可以将 gtid_purged 的值替换为指定的 GTID 集,或者将指定的 GTID 集追加到 gtid_purged 的值中。如果服务器没有现有的 GTIDs,例如空服务器,您正在使用备份来 provision 数据库,那么这两种方法都将产生相同的结果。如果您正在恢复一个部分备份,例如使用 mysqldump 生成的备份(包括服务器上的所有事务的 GTIDs,即使备份是部分的),那么使用第一种方法替换 gtid_purged 的值。如果您正在恢复一个不相交的备份,例如使用来自两个不同服务器的备份来 provision 多源副本,那么使用第二种方法追加到 gtid_purged 的值中。

Note

如果服务器上存在来自 MySQL 5.7.7 或更旧版本的二进制日志文件(例如,在升级旧服务器到 MySQL 8.3 后),在发出SET @@GLOBAL.gtid_purged语句后,您可能需要在服务器的配置文件中设置binlog_gtid_simple_recovery=FALSE,然后重新启动服务器,否则gtid_purged可能会被计算错误。请参阅binlog_gtid_simple_recovery的描述,以了解需要此设置的情况。