Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Disabling GTID Transactions Online

19.1.4.3 在线禁用GTID事务

本节描述如何在线禁用GTID事务的服务器。这一过程不需要将服务器离线,并适合生产环境使用。但是,如果您可以在禁用GTID模式时将服务器离线,那么该过程将更容易。

该过程与在线启用GTID事务类似,但步骤相反。唯一的区别是等待记录事务复制的点。

在开始之前,所有服务器必须满足以下条件:

  • 所有服务器都将gtid_mode设置为ON

  • 没有服务器设置--replicate-same-server-id选项。如果设置了该选项,并且--log-replica-updates选项(默认)启用二进制日志记录(也是默认的),那么您无法禁用GTID事务。这组合选项会在循环复制中引发无限循环。

  1. 在每个副本上执行以下操作;如果您使用多源复制,请为每个通道执行以下操作,并包括FOR CHANNEL 'channel'子句:

    STOP REPLICA [FOR CHANNEL 'channel'];
    
    CHANGE REPLICATION SOURCE TO SOURCE_AUTO_POSITION = 0, 
      SOURCE_LOG_FILE = file, 
      SOURCE_LOG_POS = position [FOR CHANNEL 'channel'];
    
    START REPLICA [FOR CHANNEL 'channel'];
  2. 在每个服务器上,执行以下语句:

    SET @@GLOBAL.gtid_mode = ON_PERMISSIVE;
  3. 在每个服务器上,执行以下语句:

    SET @@GLOBAL.gtid_mode = OFF_PERMISSIVE;
  4. 在每个服务器上,等待gtid_owned为空字符串;您可以如下所示检查:

    SELECT @@GLOBAL.gtid_owned;

    在副本上,可能会出现空字符串,然后再次变为非空字符串。这不是问题,只要至少有一次为空字符串。

  5. 等待所有当前存在于任何二进制日志中的事务在所有副本上提交。请参阅第 19.1.4.4 节,“验证匿名事务的复制”以获取检查所有匿名事务是否已复制到所有服务器的方法。

  6. 如果您使用二进制日志来执行其他操作,例如执行点时间备份或恢复,请等待不再需要包含GTID事务的旧二进制日志。

    例如,在上一步完成后,您可以在备份服务器上执行FLUSH LOGS。然后,手动执行备份或等待下一个周期性备份例程。

    理想情况下,您应该等待服务器清除所有在上一步完成时存在的二进制日志,并等待在那之前执行的备份过期。

    请注意,包含GTID事务的日志不能在下一步使用。因此,在继续之前,您必须确保没有未提交的GTID事务存在于拓扑结构中。

  7. 在每个服务器上,执行以下语句:

    SET @@GLOBAL.gtid_mode = OFF;
  8. 在每个服务器上,将gtid_mode设置为OFFmy.cnf中。可选地,您也可以将enforce_gtid_consistency设置为OFF;在执行后,您也应该将enforce_gtid_consistency添加到配置文件中。

如果您想降级到早期版本的MySQL,现在可以按照正常的降级过程进行。