Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


19.1.6.5 全局事务 ID 系统变量

MySQL 服务器系统变量,用于监控和控制全局事务标识符(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.4 的老服务器),则在binlog_gtid_simple_recovery=TRUE下,gtid_executedgtid_purged可能在以下两个情况下初始化错误:

    • 最新的二进制日志由 MySQL 5.7.5 或更早版本生成,并且gtid_mode在某些二进制日志中为ON,但在最新的二进制日志中为OFF

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

    如果在某种情况下计算的GTID集不正确,即使服务器后续重启,也将保持不正确。如果服务器可能会遇到以下情况之一,请在启动或重启服务器前将binlog_gtid_simple_recovery=FALSE设置为FALSE。

    binlog_gtid_simple_recovery=FALSE时,计算gtid_executedgtid_purged的方法将被改变,以便遍历二进制日志文件如下:

    • 而不是使用gtid_executed的值和最新的二进制日志文件中的GTID日志事件,而是从最新的二进制日志文件开始计算gtid_executed,并使用gtid_executed的值和最新的二进制日志文件中的任何GTID日志事件。如果服务器的最新二进制日志文件中没有GTID日志事件,例如如果gtid_mode=ON曾经使用,但后来服务器被更改为gtid_mode=OFF,那么这个过程可能需要很长时间。

    • 而不是使用gtid_purged的值从最旧的二进制日志文件开始计算gtid_purged,并使用gtid_purged的值从最旧的二进制日志文件开始计算,如果找到非空gtid_purged值或至少一个GTID日志事件(表示GTID的使用从该点开始)。如果服务器的更旧二进制日志文件中没有GTID日志事件,例如如果gtid_mode=ON只在最近设置在服务器上,这个过程可能需要很长时间。

  • enforce_gtid_consistency

    Command-Line Format --enforce-gtid-consistency[=value]
    System Variable enforce_gtid_consistency
    Scope Global
    Dynamic Yes
    SET_VAR Hint Applies No
    Type Enumeration
    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一致性将不被检查或强制执行。

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

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

    • 更新事务和非事务表的语句或事务。有一个例外,即在同一个事务或语句中,可以在非事务表上执行非事务DML,如果所有非事务表都是临时表。

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

    更多信息,请参见第19.1.3.7节,“与GTIDs的复制限制”

    在 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 Global
    Dynamic No
    SET_VAR Hint Applies No
    Type String
    Unit set of GTIDs

    当与全局范围使用时,这个变量包含了服务器上执行的所有事务和GTIDs的表示形式,以及由SET gtid_purged语句设置的GTIDs。这与SHOW BINARY LOG STATUSSHOW REPLICA STATUSExecuted_Gtid_Set列的值相同。该变量的值是一个GTID集,详见GTID Sets

    服务器启动时,@@GLOBAL.gtid_executed将被初始化。详见binlog_gtid_simple_recovery以了解如何将二进制日志迭代到gtid_executed。然后,GTIDs将被添加到集中,因为事务被执行或执行了SET gtid_purged语句。

    在任何给定的时间点,binary logs中可以找到的事务集等于GTID_SUBTRACT(@@GLOBAL.gtid_executed, @@GLOBAL.gtid_purged),即所有在binary log中尚未被purged的事务。

    执行RESET BINARY LOGS AND GTIDS将使该变量被重置为一个空字符串。GTIDs除非在清除该集时,否则不会从该集中移除其他事务。

  • gtid_executed_compression_period

    Command-Line Format --gtid-executed-compression-period=#
    System Variable gtid_executed_compression_period
    Scope Global
    Dynamic Yes
    SET_VAR Hint Applies No
    Type Integer
    Default Value 0
    Minimum Value 0
    Maximum Value 4294967295

    每处理该数量的事务,压缩mysql.gtid_executed表。启用binary logging时,使用的压缩方法不同,binary log旋转时将压缩mysql.gtid_executed表。禁用binary logging时,压缩线程将睡眠直到指定的事务数被执行,然后唤醒以压缩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 Table Compression以获取更多信息。

  • gtid_mode

    Command-Line Format --gtid-mode=MODE
    System Variable gtid_mode
    Scope Global
    Dynamic Yes
    SET_VAR Hint Applies No
    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_purgedgtid_executed的值将始终保持不变,即使gtid_mode的值发生变化。因此,即使更改了gtid_mode的值,这些变量仍然包含正确的值。

  • gtid_next

    System Variable gtid_next
    Scope Session
    Dynamic
    SET_VAR Hint Applies
    Type 枚举
    Default Value AUTOMATIC
    Valid Values

    AUTOMATIC

    AUTOMATIC:<TAG>

    ANONYMOUS

    <UUID>:<NUMBER>

    <UUID>:<TAG>:<NUMBER>

    该变量用于指定是否和如何获取下一个GTID(见第19.1.3节,“Replication with Global Transaction Identifiers”)。

    设置会话值的系统变量是受限制的操作。会话用户必须具有REPLICATION_APPLIER特权(见第19.3.3节,“Replication Privilege Checks”),或具有设置受限制的会话变量的权限(见第7.1.9.1节,“System Variable Privileges”)。

    gtid_next可以取以下值:

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

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

      标签必须符合正则表达式[a-z_][a-z0-9_]{0,7},即必须符合以下规则:

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

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

      • 剩余的字符可以是字母,数字09,或下划线(_)。

      gtid_next设置为AUTOMATIC:TAGUUID:TAG:NUMBER需要TRANSACTION_GTID_TAG特权,以及至少一个SYSTEM_VARIABLES_ADMINSESSION_VARIABLES_ADMINREPLICATION_APPLIER特权。对于REPLICATION_CHECKS_APPLIER,还需要REPLICATION_APPLIER特权。

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

    • 一个全局事务ID,可以是以下格式之一:UUID:NUMBERUUID:TAG:NUMBER

    哪些选项是有效的,取决于gtid_mode的设置;见第19.1.4.1节,“Replication Mode Concepts”了解更多信息。设置这个变量无效,如果gtid_mode设置为OFF

    在设置gtid_modeUUID:NUMBERUUID:TAG:NUMBER后,并且已经提交或回滚了事务,需要再次执行明确的SET gtid_next语句,以便执行任何其他语句。

    DROP TABLEDROP TEMPORARY TABLE在使用非临时表和临时表、或使用事务存储引擎的临时表和使用非事务存储引擎的临时表时,会出现明确的错误。

    了解更多信息,请见The gtid_next System Variable,以及第19.1.4节,“Changing GTID Mode on Online Servers”

  • gtid_owned

    System Variable gtid_owned
    Scope Global, Session
    Dynamic No
    SET_VAR Hint Applies No
    Type String
    Unit set of GTIDs

    这个只读变量主要用于内部使用。它的内容取决于其作用域。

    • 在全局作用域下,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

    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。

    服务器启动时,gtid_purged的全局值将被初始化为一个GTID集。关于如何计算这个GTID集的信息,请参见The gtid_purged System Variable。如果服务器上存在MySQL 5.7.7或更早版本的二进制日志文件,您可能需要将binlog_gtid_simple_recovery=FALSE设置到服务器配置文件中,以产生正确的计算。详见binlog_gtid_simple_recovery的描述,以了解在什么情况下需要设置该值。

    您必须拥有TRANSACTION_GTID_TAG权限来设置gtid_purged

    发出RESET BINARY LOGS AND GTIDSgtid_purged的值重置为一个空字符串。

    您可以将gtid_purged的值设置为记录服务器上的某个GTID集已经被应用,但它们不在服务器上的任何二进制日志中。例如,这个操作的用例是,您正在恢复一个或多个数据库的备份,但您不具有相关的二进制日志。

    Important

    GTIDs仅在服务器实例上可用,直到非负有符号64位整数的最大值(263 - 1)。如果将gtid_purged的值设置为接近这个限制的数字,后续提交可能会导致服务器运行出GTIDs并执行由binlog_error_action指定的操作。服务器实例将在达到限制时发出警告消息。

    有两种方式可以设置gtid_purged的值。您可以将gtid_purged的值替换为指定的GTID集,或者将指定的GTID集追加到gtid_purged中。如果服务器没有现有GTIDs,例如一个空服务器,您正在使用备份恢复现有数据库,两个方法都将产生相同的结果。如果您正在恢复一个备份,该备份与服务器上的事务重叠,例如将一个损坏的表替换为来自源的部分备份,使用第一个方法替换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_purged中的GTIDs,并且不能包含在gtid_executed中的GTIDs中还没有被purged的GTIDs。gtid_set也不能包含在@@global.gtid_owned中的GTIDs,即当前服务器正在处理的事务的GTIDs。

      结果是,gtid_purged的全局值被设置为gtid_setgtid_executed的值变为gtid_setgtid_executed的并集。

    • 要将指定的GTID集追加到gtid_purged中,请使用以下语句,GTID集前加一个加号(+):

      SET @@GLOBAL.gtid_purged = '+gtid_set'

      gtid_set 不能 与当前的 gtid_executed 值相交。在其他字样,新的 GTID 集合不能包括 gtid_executed 中的任何 GTID,包括已经在 gtid_purged 中的交易。 gtid_set 也不能包括在 @@global.gtid_owned 中的任何 GTID,即当前服务器正在处理的交易的 GTID。

      结果是 gtid_set 添加到 gtid_executedgtid_purged 中。

Note

如果服务器上存在 MySQL 5.7.7 或更早版本的二进制日志(例如,在升级到 MySQL 8.4 的 older 服务器后),在执行 SET @@GLOBAL.gtid_purged 语句后,您可能需要在重启服务器前将 binlog_gtid_simple_recovery=FALSE 在服务器配置文件中设置,以免 gtid_purged 计算错误。详细信息请参阅 binlog_gtid_simple_recovery 的描述,以了解在何种情况下需要设置该选项。