19.1.6.5 全局事务 ID 系统变量
MySQL 服务器系统变量,用于监控和控制全局事务标识符(GTIDs)。欲了解更多信息,请参见第19.1.3节,“使用全局事务标识符进行复制”.
-
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_executed
和gtid_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_executed
和gtid_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_executed
和gtid_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
只在最近设置在服务器上,这个过程可能需要很长时间。
-
-
Command-Line Format --enforce-gtid-consistency[=value]
System Variable enforce_gtid_consistency
Scope Global Dynamic Yes SET_VAR
Hint AppliesNo 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安全语句,可以被日志记录,因此以下操作不能与该选项一起使用:-
更新事务和非事务表的语句或事务。有一个例外,即在同一个事务或语句中,可以在非事务表上执行非事务DML,如果所有非事务表都是临时表。
-
CREATE TABLE ... SELECT
语句支持存储引擎支持原子DDL的存储引擎。
更多信息,请参见第19.1.3.7节,“与GTIDs的复制限制”。
在 MySQL 5.7 之前和早期的该系列发布中,布尔
enforce_gtid_consistency
变量默认为OFF
。为了保持与这些早期版本的兼容性,该枚举变量默认为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
和信息架构。 -
-
System Variable gtid_executed
Scope Global Dynamic No SET_VAR
Hint AppliesNo Type String Unit set of GTIDs 当与全局范围使用时,这个变量包含了服务器上执行的所有事务和GTIDs的表示形式,以及由
SET
gtid_purged
语句设置的GTIDs。这与SHOW BINARY LOG STATUS
和SHOW REPLICA STATUS
的Executed_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 AppliesNo 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以获取更多信息。
-
Command-Line Format --gtid-mode=MODE
System Variable gtid_mode
Scope Global Dynamic Yes SET_VAR
Hint AppliesNo 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
,那么可以将其更改为OFF
或ON_PERMISSIVE
,但不能更改为ON
。gtid_purged
和gtid_executed
的值将始终保持不变,即使gtid_mode
的值发生变化。因此,即使更改了gtid_mode
的值,这些变量仍然包含正确的值。 -
-
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:
: 使用下一个自动生成的全局事务ID,并添加用户指定的标签,以UUID:TAG
TAG
:NUMBER格式。标签必须符合正则表达式
[a-z_][a-z0-9_]{0,7}
,即必须符合以下规则:将
gtid_next
设置为AUTOMATIC:
或TAG
需要UUID
:TAG
:NUMBER
TRANSACTION_GTID_TAG
特权,以及至少一个SYSTEM_VARIABLES_ADMIN
、SESSION_VARIABLES_ADMIN
或REPLICATION_APPLIER
特权。对于REPLICATION_CHECKS_APPLIER
,还需要REPLICATION_APPLIER
特权。 -
ANONYMOUS
: 事务没有全局标识符,并且由文件和位置唯一标识。 -
一个全局事务ID,可以是以下格式之一:
UUID
:NUMBER
或UUID
:TAG
:NUMBER
。
哪些选项是有效的,取决于
gtid_mode
的设置;见第19.1.4.1节,“Replication Mode Concepts”了解更多信息。设置这个变量无效,如果gtid_mode
设置为OFF
。在设置
gtid_mode
为
或UUID
:NUMBER
后,并且已经提交或回滚了事务,需要再次执行明确的UUID
:TAG
:NUMBER
SET gtid_next
语句,以便执行任何其他语句。DROP TABLE
或DROP TEMPORARY TABLE
在使用非临时表和临时表、或使用事务存储引擎的临时表和使用非事务存储引擎的临时表时,会出现明确的错误。了解更多信息,请见The gtid_next System Variable,以及第19.1.4节,“Changing GTID Mode on Online Servers”。
-
-
System Variable gtid_owned
Scope Global, Session Dynamic No SET_VAR
Hint AppliesNo 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
系统变量控制的会话状态跟踪器。
-
-
System Variable gtid_purged
Scope 全局 Dynamic 是 SET_VAR
Hint Applies否 Type 字符串 Unit GTID集 全局变量
gtid_purged
的值(@@GLOBAL.gtid_purged
)是一个GTID集,包含了服务器上所有已提交的事务的GTID,但这些事务不在服务器上的任何二进制日志文件中。gtid_purged
是gtid_executed
的子集。以下类别的GTID在gtid_purged
中:-
在复制事务中提交时,禁用二进制日志记录的GTID。
-
在服务器上已经删除的二进制日志文件中的GTID。
-
通过语句
SET @@GLOBAL.gtid_purged
明确地添加到GTID集中的GTID。
服务器启动时,
gtid_purged
的全局值将被初始化为一个GTID集。关于如何计算这个GTID集的信息,请参见Thegtid_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 GTIDS
将gtid_purged
的值重置为一个空字符串。您可以将
gtid_purged
的值设置为记录服务器上的某个GTID集已经被应用,但它们不在服务器上的任何二进制日志中。例如,这个操作的用例是,您正在恢复一个或多个数据库的备份,但您不具有相关的二进制日志。ImportantGTIDs仅在服务器实例上可用,直到非负有符号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_set
,gtid_executed
的值变为gtid_set
和gtid_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_executed
和gtid_purged
中。
-
如果服务器上存在 MySQL 5.7.7 或更早版本的二进制日志(例如,在升级到 MySQL 8.4 的 older 服务器后),在执行 SET @@GLOBAL.gtid_purged
语句后,您可能需要在重启服务器前将 binlog_gtid_simple_recovery=FALSE
在服务器配置文件中设置,以免 gtid_purged
计算错误。详细信息请参阅 binlog_gtid_simple_recovery
的描述,以了解在何种情况下需要设置该选项。