文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  在线禁用 GTID 事务

19.1.4.3 在线禁用 GTID 事务

本节介绍如何在已在线的服务器上禁用 GTID 事务。此过程不需要将服务器脱机,适用于生产环境。但是,如果您有可能会在禁用 GTID 模式时将服务器脱机,那么该过程会更容易。

该过程类似于在服务器在线时启用 GTID 事务,但步骤相反。唯一不同的是您等待记录的事务复制的点。

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

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

  • 在任何服务器上都没有设置 --replicate-same-server-id 选项。如果您同时设置了此选项和 --log-replica-updates 选项(默认)并且启用了二进制日志记录(也是默认设置),则无法禁用 GTID 事务。在没有 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。然后,您可以手动进行备份,也可以等待您可能设置的任何定期备份例程的下次迭代。

    理想情况下,您应该等待服务器清除完成上一步 5 时存在的全部二进制日志,以及在此之前进行的任何备份都已过期。

    您应该记住,包含 GTID 事务的日志在下一步之后将无法使用。因此,在继续执行之前,您必须确保拓扑结构中的任何地方都不存在未提交的 GTID 事务。

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

    SET @@GLOBAL.gtid_mode = OFF;
  8. 在每个服务器上,在 my.cnf 中设置 gtid_mode=OFF。或者,您也可以设置 enforce_gtid_consistency=OFF;之后,您还应该将 enforce_gtid_consistency=OFF 添加到您的配置文件中。

如果您想降级到早期版本的 MySQL,您可以现在使用正常的降级流程进行操作。