全局交易ID系统变量
本节中描述的MySQL Server系统变量用于监视和控制全局事务标识符(GTID)。有关更多信息,请参见“使用全局事务标识符进行复制”。
binlog_gtid_simple_recovery
属性 值 命令行格式 --binlog-gtid-simple-recovery[={OFF|ON}] 系统变量 binlog_gtid_simple_recovery 范围 Global 动态 没有 SET_VAR
提示适用没有 类型 布尔型 默认值 ON 此变量控制MySQL启动或重新启动时在搜索GTID期间如何迭代二进制日志文件。
当为时
binlog_gtid_simple_recovery=TRUE
,这是MySQL 8.0的默认设置,在启动时会根据最新和最早的二进制日志文件中的值来计算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.0之后),使用
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
在启动或重新启动服务器之前进行设置。当
binlog_gtid_simple_recovery=FALSE
被设置时,计算的方法gtid_executed
和gtid_purged
如在描述的gtid_purged
系统变量被如下改变为迭代二进制日志文件:- 它的计算不是
Previous_gtids_log_event
从最新的二进制日志文件中使用of值和GTID日志事件,而是从最新的二进制日志文件中进行gtid_executed
迭代,并使用它的值Previous_gtids_log_event
和第一个二进制日志文件中的GTID日志事件在其中找到Previous_gtids_log_event
值。如果服务器的最新二进制日志文件没有GTID日志事件,例如,如果gtid_mode=ON
使用了GTID日志文件,但后来将服务器更改为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产生的最新的二进制日志或更早版本,并且
enforce_gtid_consistency
属性 值 命令行格式 --enforce-gtid-consistency[=value] 系统变量 enforce_gtid_consistency 范围 Global 动态 是 SET_VAR
提示适用没有 类型 列举 默认值 OFF 有效值 OFF
ON
WARN
根据此变量的值,服务器通过仅允许执行可以使用GTID安全记录的语句来实现GTID一致性。您必须将此变量设置为
ON
启用基于GTID复制之前。这些值
enforce_gtid_consistency
可以被配置成是:OFF
:允许所有事务违反GTID一致性。ON
:不允许任何交易违反GTID一致性。WARN
:允许所有事务违反GTID一致性,但是在这种情况下会生成警告。
enforce_gtid_consistency
设置为时,仅可以记录可使用GTID安全语句记录的语句ON
,因此此处列出的操作不能与该选项一起使用:CREATE TABLE ... SELECT
陈述CREATE TEMPORARY TABLE
或DROP TEMPORARY TABLE
交易内的陈述- 事务或语句同时更新事务表和非事务表。如果所有非事务性表都是临时的,则有一个例外,即与事务性DML相同的事务或同一语句中允许使用非事务性DML 。
--enforce-gtid-consistency
仅在为语句执行二进制日志记录时才生效。如果在服务器上禁用了二进制日志记录,或者由于过滤器将语句删除而未将语句写入二进制日志,则不会检查或不对未记录的语句执行GTID一致性。有关更多信息,请参见“使用GTID复制的限制”。
在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
和信息模式的文本形式。gtid_executed
属性 值 系统变量 gtid_executed 系统变量 gtid_executed 范围 Global 范围 Global, Session 动态 没有 动态 没有 SET_VAR
提示适用没有 SET_VAR
提示适用没有 类型 string 与全局范围一起使用时,此变量包含服务器上执行的所有事务的集合以及由语句设置的GTID的表示。这是相同的值列在的输出和。此变量的值是GTID集,有关更多信息,请参见 GTID集。
SET
gtid_purged
Executed_Gtid_Set
SHOW MASTER STATUS
SHOW SLAVE STATUS
服务器启动时,将
@@GLOBAL.gtid_executed
被初始化。请参阅参考资料binlog_gtid_simple_recovery
,以获取有关如何迭代二进制日志以进行填充的更多信息gtid_executed
。然后,在执行事务或执行任何语句时,会将GTID添加到集合中。SET
gtid_purged
在任何给定时间可以在二进制日志中找到的事务集等于
GTID_SUBTRACT(@@GLOBAL.gtid_executed,@@GLOBAL.gtid_purged)
;也就是说,针对二进制日志中尚未清除的所有事务。发出
RESET MASTER
会使该变量的全局值(而不是会话值)重置为空字符串。除非由于清除了GTID,否则不会从该集合中移除GTIDRESET MASTER
。在某些较早的版本中,此变量也可以与会话范围一起使用,其中包含表示当前会话中写入高速缓存的事务集的表示。会话范围现已弃用。
gtid_executed_compression_period
属性 值 命令行格式 --gtid-executed-compression-period=# 系统变量 gtid_executed_compression_period 范围 Global 动态 是 SET_VAR
提示适用没有 类型 整数 默认值 1000 最低值 0 最大值 4294967295 mysql.gtid_executed
每次处理完这么多事务后,都要压缩表。设置为0表示此表未压缩。由于使用二进制日志时不会压缩表,因此除非禁用了二进制日志记录,否则设置变量的值将无效。有关更多信息,请参见 mysql.gtid_executed表压缩。
gtid_mode
属性 值 命令行格式 --gtid-mode=MODE 系统变量 gtid_mode 范围 Global 动态 是 SET_VAR
提示适用没有 类型 列举 默认值 OFF 有效值 OFF
OFF_PERMISSIVE
ON_PERMISSIVE
ON
控制是否启用基于GTID的日志记录以及日志可以包含的事务类型。您必须具有足以设置全局系统变量的特权。请参见“系统变量特权”。
enforce_gtid_consistency
在设置之前必须为truegtid_mode=ON
。修改此变量之前,请参见“更改在线服务器上的复制模式”。记录的事务可以是匿名的,也可以使用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
,这些变量也包含正确的值。gtid_next
属性 值 系统变量 gtid_next 范围 Session 动态 是 SET_VAR
提示适用没有 类型 列举 默认值 AUTOMATIC 有效值 AUTOMATIC
ANONYMOUS
UUID:NUMBER
此变量用于指定是否以及如何获取下一个GTID。
设置此系统变量的会话值是受限制的操作。会话用户必须具有
REPLICATION_APPLIER
特权(请参见“复制特权检查”)或具有足以设置受限会话变量的特权(请参见“系统变量特权”)。gtid_next
可以采用以下任何值:AUTOMATIC
:使用下一个自动生成的全局事务ID。ANONYMOUS
:事务没有全局标识符,仅由文件和位置标识。- 全局交易ID
UUID
:NUMBER
格式。
上述选项中的哪一个有效,取决于的设置
gtid_mode
,有关更多信息,请参见“复制模式概念”。如果gtid_mode
为,则设置此变量无效OFF
。在将此变量设置为
UUID
:之后NUMBER
,并且事务已提交或回滚之后,SET GTID_NEXT
必须在其他任何语句之前再次发出显式语句。DROP TABLE
或DROP TEMPORARY TABLE
在将非临时表与临时表或使用事务性存储引擎的临时表与使用非事务性存储引擎的临时表结合使用时失败,并出现显式错误。gtid_owned
属性 值 系统变量 gtid_owned 范围 Global, Session 动态 没有 SET_VAR
提示适用没有 类型 string 此只读变量主要供内部使用。其内容取决于其范围。
- 与全局作用域一起使用时,
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
仅在执行事务的commit语句期间简短地填充了,因此无法从相关会话中观察到它,尽管如果@@global.gtid_owned
在正确的位置读取了该信息,则会将其列出。如果需要跟踪会话中客户端处理的GTID,则可以启用由session_track_gtids
系统变量控制的会话状态跟踪器。
- 与全局作用域一起使用时,
gtid_purged
属性 值 系统变量 gtid_purged 范围 Global 动态 是 SET_VAR
提示适用没有 类型 string 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集中的事务,尽管它们在服务器上的任何二进制日志中都不存在。此操作的一个示例用例是,正在还原服务器上一个或多个数据库的备份,但是在服务器上没有包含事务的相关二进制日志。从MySQL 8.0开始,有两种方法来设置的值
gtid_purged
。您可以将的值替换为gtid_purged
指定的GTID集,也可以将指定的GTID集附加到已由持有的GTID集gtid_purged
。如果服务器没有现有的GTID,例如,您要使用现有数据库的备份配置的空服务器,则两种方法的结果相同。如果要还原与服务器上已经存在的事务重叠的备份,例如,将损坏的表替换为使用mysqldump从主数据库进行的部分转储(即使转储是部分的,它也包括服务器上所有事务的GTID),请使用第一种方法替换的值gtid_purged
。如果要还原与服务器上已经存在的事务脱节的备份,例如使用来自两个不同服务器的转储来提供多源复制从属,请使用第二种方法将值相加gtid_purged
。要将值替换为
gtid_purged
您指定的GTID集,请使用以下语句:SET @@GLOBAL.gtid_purged = 'gtid_set'gtid_set
必须是的当前值的超集gtid_purged
,并且不能与相交gtid_subtract(gtid_executed,gtid_purged)
。换句话说,新的GTID集必须包含已经存在的所有GTIDgtid_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集不得在中包含任何GTIDgtid_executed
,包括已经在中的交易gtid_purged
。gtid_set
也不能包含中的任何GTID@@global.gtid_owned
,也就是服务器上当前正在处理的事务的GTID。结果是将
gtid_set
其添加到gtid_executed
和中gtid_purged
。
如果服务器上存在来自MySQL 5.7.7或更早版本的二进制日志(例如,在将旧服务器升级到MySQL 8.0之后),则在发出一条SET @@GLOBAL.gtid_purged
语句后,可能需要binlog_gtid_simple_recovery=FALSE
在服务器的配置文件中进行设置,然后重新启动服务器,否则gtid_purged
可能计算不正确。有关binlog_gtid_simple_recovery
需要此设置的情况的详细信息,请参见说明。