10bet网址
MySQL复制
相关的文档10bet官方网站 下载节选
PDF(美国Ltr)- 1.7 mb
PDF (A4)- 1.7 mb


2.6.5全局事务ID系统变量

本节中描述的MySQL Server系统变量用于监视和控制全局事务标识符(gtid)。有关其他信息,请参见第2.3节,“使用全局事务标识符进行复制”

  • binlog_gtid_simple_recovery

    命令行格式 ——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 = TRUEgtid_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(=价值)
    系统变量 enforce_gtid_consistency
    范围 全球
    动态 是的
    SET_VAR提示应用 没有
    类型 枚举
    默认值
    有效值

    警告

    根据这个变量的值,服务器通过只允许执行可以使用GTID安全地记录的语句来强制GTID一致性。你必须将此变量设置为才能启用基于GTID的复制。

    这些价值观enforce_gtid_consistency可配置为:

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

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

    • 警告:允许所有事务违反GTID一致性,但会产生警告。

    ——enforce-gtid-consistency只有在对语句进行二进制日志记录时才会生效。如果在服务器上禁用二进制日志记录,或者如果语句因为被过滤器删除而没有写入二进制日志,那么对于没有日志记录的语句,将不检查或执行GTID一致性。

    只有可以使用GTID安全语句记录的语句才可以记录enforce_gtid_consistency设置为,因此这里列出的操作不能与该选项一起使用:

    • 创建临时表删除临时表事务中的语句。

    • 更新事务性和非事务性表的事务或语句。有一个例外,即允许非事务性DML与事务性DML在同一事务或同一语句中出现nontransactional桌子是临时的。

    • 创建表…选择语句,在MySQL 8.0.21之前。从MySQL 8.0.21,创建表…选择语句被允许用于支持原子DDL的存储引擎。

    有关更多信息,请参见第2.3.7节,“使用gtid复制的限制”

    在MySQL 5.7之前和该版本系列的早期版本中,布尔值enforce_gtid_consistency默认.为了保持与这些早期版本的兼容性,枚举默认为,和设置——enforce-gtid-consistency没有值则被解释为将值设置为.变量的值也有多个文本别名:0 = = FALSE1 = = TRUE2 =警告.这与其他枚举类型不同,但与以前版本中使用的布尔类型保持兼容性。这些更改会影响变量返回的内容。使用选择@@ENFORCE_GTID_CONSISTENCY显示诸如' enforce_gtid_consistency '之类的变量,从information_schema中选择*。变量' variable_name ' = ' enforce_gtid_consistency ',都返回文本形式,而不是数字形式。这是一个不兼容的更改,因为@@ENFORCE_GTID_CONSISTENCY返回布尔值的数字形式,但返回的文本形式显示和信息模式。

  • gtid_executed

    系统变量 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.23InnoDB和非InnoDB事务被写入mysql.gtid_executed表由同样的过程,和gtid_executed_compression_period缺省值为0。

    看到mysql.gtid_executedTable Compression更多信息。

  • gtid_mode

    命令行格式 ——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_next

    系统变量 gtid_next
    范围 会话
    动态 是的
    SET_VAR提示应用 没有
    类型 枚举
    默认值 自动
    有效值

    自动

    匿名

    UUID:数量

    该变量用于指定是否以及如何获取下一个GTID。

    设置此系统变量的会话值是受限制的操作。会话用户必须具有REPLICATION_APPLIER特权(见复制权限检查)或足够设置受限制的会话变量的特权(参见系统变量权限).

    gtid_next可以采用以下值中的任何一个:

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

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

    • 中的全局事务IDUUID数量格式。

    的设置决定了上面哪个选项是有效的gtid_mode,请参阅第2.4.1节“复制模式概念”更多信息。设置此变量没有效果,如果gtid_mode

    在将此变量设置为之后UUID数量,并且事务已经提交或回滚,即显式设置GTID_NEXT声明必须在任何其他声明之前再次发出。

    删除表删除临时表当非临时表与临时表的组合使用时,或使用事务性存储引擎的临时表与使用非事务性存储引擎的临时表的组合使用时,失败并出现显式错误。

  • gtid_owned

    系统变量 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

    系统变量 gtid_purged
    范围 全球
    动态 是的
    SET_VAR提示应用 没有
    类型 字符串
    单位 gtid的集合

    的全局值gtid_purged系统变量(@@GLOBAL.gtid_purged)是一个GTID集合,由服务器上已提交的所有事务的GTID组成,但这些事务不存在于服务器上的任何二进制日志文件中。gtid_purgedgtid_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_purgedgtid_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了解需要此设置的情况的详细信息。