• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 全局交易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_executedgtid_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_modeON对一些二进制日志,但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_executedgtid_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是最近才在服务器上设置的,则此过程可能需要很长时间。
    • 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 TABLEDROP TEMPORARY TABLE交易内的陈述
      • 事务或语句同时更新事务表和非事务表。如果所有非事务性表都是临时的,则有一个例外,即与事务性DML相同的事务或同一语句中允许使用非事务性DML 。

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

      有关更多信息,请参见“使用GTID复制的限制”。

      在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

      属性
      系统变量gtid_executed
      系统变量gtid_executed
      范围Global
      范围Global, Session
      动态没有
      动态没有
      SET_VAR提示适用没有
      SET_VAR提示适用没有
      类型string

      与全局范围一起使用时,此变量包含服务器上执行的所有事务的集合以及由语句设置的GTID的表示。这是相同的值列在的输出和。此变量的值是GTID集,有关更多信息,请参见 GTID集。SETgtid_purgedExecuted_Gtid_SetSHOW MASTER STATUSSHOW SLAVE STATUS

      服务器启动时,将@@GLOBAL.gtid_executed被初始化。请参阅参考资料binlog_gtid_simple_recovery,以获取有关如何迭代二进制日志以进行填充的更多信息gtid_executed。然后,在执行事务或执行任何语句时,会将GTID添加到集合中。SETgtid_purged

      在任何给定时间可以在二进制日志中找到的事务集等于GTID_SUBTRACT(@@GLOBAL.gtid_executed,@@GLOBAL.gtid_purged);也就是说,针对二进制日志中尚未清除的所有事务。

      发出RESET MASTER会使该变量的全局值(而不是会话值)重置为空字符串。除非由于清除了GTID,否则不会从该集合中移除GTID RESET 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在设置之前必须为true gtid_mode=ON。修改此变量之前,请参见“更改在线服务器上的复制模式”。

      记录的事务可以是匿名的,也可以使用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

      属性
      系统变量gtid_next
      范围Session
      动态
      SET_VAR提示适用没有
      类型列举
      默认值AUTOMATIC
      有效值

      AUTOMATIC

      ANONYMOUS

      UUID:NUMBER

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

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

      gtid_next可以采用以下任何值:

      • AUTOMATIC:使用下一个自动生成的全局事务ID。
      • ANONYMOUS:事务没有全局标识符,仅由文件和位置标识。
      • 全局交易ID UUIDNUMBER格式。

      上述选项中的哪一个有效,取决于的设置gtid_mode,有关更多信息,请参见“复制模式概念”。如果gtid_mode为,则设置此变量无效OFF

      在将此变量设置为UUID:之后NUMBER,并且事务已提交或回滚之后,SET GTID_NEXT必须在其他任何语句之前再次发出显式语句。

      DROP TABLEDROP 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集必须包含已经存在的所有GTID gtid_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集不得在中包含任何GTID gtid_executed,包括已经在中的交易gtid_purgedgtid_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需要此设置的情况的详细信息,请参见说明。