本节中描述的MySQL Server系统变量用于监视和控制全局事务标识符(gtid)。有关其他信息,请参见第2.3节,“使用全局事务标识符进行复制”.
-
命令行格式 ——binlog-gtid-simple-recovery[={|在}]
系统变量 binlog_gtid_simple_recovery
范围 全球 动态 没有 SET_VAR
提示应用没有 类型 布尔 默认值 在
这个变量控制在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
是在
对于一些二进制对数,但是从
对于最新的二进制日志。一个
设置@@GLOBAL.gtid_purged
语句是在MySQL 5.7.7或更早版本上发出的,并且在设置@@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日志事件,例如Ifgtid_mode =对
使用,但服务器后来更改为gtid_mode =了
在美国,这个过程可能需要很长时间。而不是使用的值
Previous_gtids_log_event
从最老的二进制日志文件,计算gtid_purged
从最老的二进制日志文件迭代,并使用的值Previous_gtids_log_event
从第一个二进制日志文件中找到非空的Previous_gtids_log_event
值,或者至少一个GTID日志事件(指示从该点开始使用GTID)。如果服务器的旧二进制日志文件没有GTID日志事件,例如Ifgtid_mode =对
是最近才在服务器上设置的,这个过程可能会花费很长时间。
-
命令行格式 ——enforce-gtid-consistency(=价值)
系统变量 enforce_gtid_consistency
范围 全球 动态 是的 SET_VAR
提示应用没有 类型 枚举 默认值 从
有效值 从
在
警告
根据这个变量的值,服务器通过只允许执行可以使用GTID安全地记录的语句来强制GTID一致性。你必须将此变量设置为
在
才能启用基于GTID的复制。这些价值观
enforce_gtid_consistency
可配置为:从
:允许所有事务违反GTID一致性。在
:不允许任何事务违反GTID一致性。警告
:允许所有事务违反GTID一致性,但会产生警告。
——enforce-gtid-consistency
只有在对语句进行二进制日志记录时才会生效。如果在服务器上禁用二进制日志记录,或者如果语句因为被过滤器删除而没有写入二进制日志,那么对于没有日志记录的语句,将不检查或执行GTID一致性。只有可以使用GTID安全语句记录的语句才可以记录
enforce_gtid_consistency
设置为在
,因此这里列出的操作不能与该选项一起使用:有关更多信息,请参见第2.3.7节,“使用gtid复制的限制”.
在MySQL 5.7之前和该版本系列的早期版本中,布尔值
enforce_gtid_consistency
默认从
.为了保持与这些早期版本的兼容性,枚举默认为从
,和设置——enforce-gtid-consistency
没有值则被解释为将值设置为在
.变量的值也有多个文本别名:0 = = FALSE
,1 = = TRUE
,2 =警告
.这与其他枚举类型不同,但与以前版本中使用的布尔类型保持兼容性。这些更改会影响变量返回的内容。使用选择@@ENFORCE_GTID_CONSISTENCY
,显示诸如' enforce_gtid_consistency '之类的变量
,从information_schema中选择*。变量' variable_name ' = ' enforce_gtid_consistency '
,都返回文本形式,而不是数字形式。这是一个不兼容的更改,因为@@ENFORCE_GTID_CONSISTENCY
返回布尔值的数字形式,但返回的文本形式显示
和信息模式。 -
系统变量 gtid_executed
范围 全球 动态 没有 SET_VAR
提示应用没有 类型 字符串 单位 gtid的集合
与全局作用域一起使用时,此变量包含在服务器上执行的所有事务的集合的表示,以及已由
集
gtid_purged
声明。的值是一样的Executed_Gtid_Set
的输出中显示主机状态
而且显示副本状态
.该变量的值是GTID集合,参见GTID集更多信息。当服务器启动时,
@@GLOBAL.gtid_executed
初始化。看到binlog_gtid_simple_recovery
有关如何迭代二进制日志以填充的更多信息gtid_executed
.然后在执行事务时(如果有事务的话)将gtid添加到集合中集
gtid_purged
语句将被执行。在任何给定时间可以在二进制日志中找到的事务集等于
GTID_SUBTRACT (@@GLOBAL。gtid_executed,@@GLOBAL.gtid_purged)
;也就是说,对于二进制日志中尚未被清除的所有事务。发行
重置的主人
导致该变量的全局值(而不是会话值)重置为空字符串。的原因清除集合时,gtid不会从此集合中删除重置的主人
.在一些较早的版本中,此变量还可以与会话作用域一起使用,其中它包含当前会话中写入缓存的事务集的表示。会话作用域现在已弃用。
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
事务被写入mysql.gtid_executed
表由单独的进程来非InnoDB
事务。如果服务器有InnoDB
交易及非InnoDB
事务时,由此系统变量控制的压缩会干扰此进程的工作,并会显著降低其速度。因此,建议您从该版本设置gtid_executed_compression_period
为0。从MySQL 8.0.23
InnoDB
和非InnoDB
事务被写入mysql.gtid_executed
表由同样的过程,和gtid_executed_compression_period
缺省值为0。-
命令行格式 ——gtid-mode =模式
系统变量 gtid_mode
范围 全球 动态 是的 SET_VAR
提示应用没有 类型 枚举 默认值 从
有效值 从
OFF_PERMISSIVE
ON_PERMISSIVE
在
控制是否启用基于GTID的日志记录,以及日志可以包含什么类型的事务。您必须具有足够的权限来设置全局系统变量。看到系统变量权限.
enforce_gtid_consistency
必须设置为在
在设置之前gtid_mode =对
.修改此变量前,请参见第2.4节“更改在线服务器的GTID模式”.记录的事务可以是匿名的,也可以使用gtid。匿名事务依赖于二进制日志文件和位置来识别特定的事务。GTID事务有一个唯一的标识符,用来引用事务。不同的模式有:
从
:新事务和复制事务都必须是匿名的。OFF_PERMISSIVE
:新的事务是匿名的。复制的事务可以是匿名的,也可以是GTID事务。ON_PERMISSIVE
:新事务为GTID事务。复制的事务可以是匿名的,也可以是GTID事务。在
:新事务和复制事务都必须是GTID事务。
从一个值到另一个值的更改一次只能进行一步。例如,如果
gtid_mode
当前设置为OFF_PERMISSIVE
,就有可能改为从
或ON_PERMISSIVE
但不是在
.的价值
gtid_purged
而且gtid_executed
是不顾价值的执着吗gtid_mode
.因此即使在改变值之后gtid_mode
,这些变量包含正确的值。 -
该变量用于指定是否以及如何获取下一个GTID。
设置此系统变量的会话值是受限制的操作。会话用户必须具有
REPLICATION_APPLIER
特权(见复制权限检查)或足够设置受限制的会话变量的特权(参见系统变量权限).gtid_next
可以采用以下值中的任何一个:自动
:使用下一个自动生成的全局事务ID。匿名
:事务没有全局标识符,仅通过文件和位置进行标识。中的全局事务ID
UUID
:数量
格式。
的设置决定了上面哪个选项是有效的
gtid_mode
,请参阅第2.4.1节“复制模式概念”更多信息。设置此变量没有效果,如果gtid_mode
是从
.在将此变量设置为之后
UUID
:数量
,并且事务已经提交或回滚,即显式设置GTID_NEXT
声明必须在任何其他声明之前再次发出。删除表
或删除临时表
当非临时表与临时表的组合使用时,或使用事务性存储引擎的临时表与使用非事务性存储引擎的临时表的组合使用时,失败并出现显式错误。 -
系统变量 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 =自动
用于会话,gtid_owned
仅在事务的提交语句执行期间简要填充,因此无法从相关会话中观察到它,尽管在if@@global.gtid_owned
是在正确的点读。如果需要跟踪会话中由客户机处理的gtid,则可以启用由控件控制的会话状态跟踪器session_track_gtids
系统变量。
-
系统变量 gtid_purged
范围 全球 动态 是的 SET_VAR
提示应用没有 类型 字符串 单位 gtid的集合
的全局值
gtid_purged
系统变量(@@GLOBAL.gtid_purged
)是一个GTID集合,由服务器上已提交的所有事务的GTID组成,但这些事务不存在于服务器上的任何二进制日志文件中。gtid_purged
是gtid_executed
.以下是gtid的类别gtid_purged
:在副本上禁用二进制日志记录的情况下提交的复制事务的gtid。
写入现在已被清除的二进制日志文件的事务的gtid。
由语句显式添加到集合的gtid
设置@@GLOBAL.gtid_purged
.
当服务器启动时,的全局值
gtid_purged
初始化为一组gtid。有关如何计算这个GTID集的信息,请参见的gtid_purged
系统变量.如果服务器上存在MySQL 5.7.7或更老版本的二进制日志,您可能需要设置binlog_gtid_simple_recovery = FALSE
在服务器的配置文件中生成正确的计算。参见描述binlog_gtid_simple_recovery
了解需要此设置的情况的详细信息。发行
重置的主人
的值。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_purged
.如果服务器没有现有的gtid,例如使用现有数据库的备份提供的空服务器,那么两种方法都会产生相同的结果。如果您正在恢复与服务器上已经存在的事务重叠的备份,例如,使用使用的源的部分转储替换损坏的表, mysqldump(其中包括服务器上所有事务的gtid,尽管转储是部分的),使用第一种方法替换的值gtid_purged
.如果要恢复与服务器上已经存在的事务分离的备份,例如使用来自两个不同服务器的转储提供多源副本,则使用第二种方法添加的值gtid_purged
.替换的值
gtid_purged
对于指定的GTID集,使用以下语句:设置@@GLOBAL.gtid_purged= 'gtid_set'
gtid_set
必须是的当前值的超集gtid_purged
,且不得与之相交gtid_subtract (gtid_executed gtid_purged)
.换句话说,新的GTID集必须包括已经存在的任何gtidgtid_purged
,不得包括任何gtidgtid_executed
还没有被清除的。gtid_set
也不能包含在中的任何gtid@@global.gtid_owned
,即当前正在服务器上处理的事务的gtid。的全局值
gtid_purged
等于gtid_set
的值gtid_executed
成为了gtid_set
和之前的值gtid_executed
.将指定的GTID集附加到
gtid_purged
,在GTID集合前使用加号(+)的以下语句:设置@@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之后),则在发出设置@@GLOBAL.gtid_purged
语句,您可能需要设置binlog_gtid_simple_recovery = FALSE
在服务器的配置文件中重新启动服务器,否则gtid_purged
可能计算错误。参见描述binlog_gtid_simple_recovery
了解需要此设置的情况的详细信息。