文档主页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF(美国信函纸) - 40.0Mb

PDF(A4) - 40.1Mb

手册页 (TGZ) - 258.2Kb

手册页 (Zip) - 365.3Kb

信息 (Gzip) - 4.0Mb

信息 (Zip) - 4.0Mb





MySQL 9.0 参考手册  /  ...  /  在线禁用 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 的早期版本,可以使用正常的降级程序立即进行。