• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 在线禁用GTID交易

    本节介绍如何在已经联机的服务器上禁用GTID事务。此过程不需要使服务器脱机,并且适合在生产中使用。但是,如果在禁用GTIDs模式时可以使服务器脱机,则此过程会更容易。

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

    在开始之前,请确保服务器满足以下前提条件:

    • 拓扑中的所有服务器都必须使用MySQL 5.7.6或更高版本。除非拓扑中的所有服务器都使用此版本,否则您不能在任何单个服务器上在线禁用GTID事务。
    • 所有服务器均gtid_mode设置为ON
    • --replicate-same-server-id没有在任何服务器上设置该选项。如果将此选项与--log-slave-updates选项(默认设置)一起设置并且启用了二进制日志记录(也是默认设置),则不能禁用GTID事务。如果没有GTID,选项的这种组合会导致循环复制中的无限循环。
    1. 在每个从属服务器上执行以下操作,如果您使用多源复制,请对每个通道执行此操作,并包含FOR CHANNELchannel子句:

      STOP SLAVE [FOR CHANNEL 'channel'];
      CHANGE MASTER TO MASTER_AUTO_POSITION = 0, MASTER_LOG_FILE = file, \
      MASTER_LOG_POS = position [FOR CHANNEL 'channel'];
      START SLAVE [FOR CHANNEL 'channel'];
      
    2. 在每台服务器上,执行:

      SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE;
      
    3. 在每台服务器上,执行:

      SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;
      
    4. 在每个服务器上,等待直到变量@@ GLOBAL.GTID_OWNED等于空字符串。可以使用以下方法进行检查:

      SELECT @@GLOBAL.GTID_OWNED;
      

      在复制从属服务器上,理论上有可能为空,然后再次变为非空。这不是问题,只需将其清空一次即可。

    5. 等待任何二进制日志中当前存在的所有事务复制到所有从属服务器。有关检查所有匿名事务是否已复制到所有服务器的一种方法,请参见“验证匿名事务的复制”。
    6. 如果将二进制日志用于复制以外的任何其他用途,例如进行时间点备份或还原:请等到不需要具有GTID事务的旧二进制日志。

      例如,在完成步骤5之后,您可以FLUSH LOGS在进行备份的服务器上执行。然后,要么明确地进行备份,要么等待您可能已设置的任何定期备份例程的下一个迭代。

      理想情况下,等待服务器清除第5步完成时存在的所有二进制日志。此外,请等待第5步到期之前进行的所有备份。

      重要

      这是此过程中的重要一点。重要的是要了解在下一步之后不能使用包含GTID事务的日志。在继续之前,您必须确保GTID事务在拓扑中的任何地方都不存在。

    7. 在每台服务器上,执行:

      SET @@GLOBAL.GTID_MODE = OFF;
      
    8. 在每台服务器上,gtid_mode=OFF在中设置my.cnf

      如果要设置enforce_gtid_consistency=OFF,则可以立即进行设置。设置之后,您应该将其添加enforce_gtid_consistency=OFF到配置文件中。

    如果要降级到MySQL的较早版本,可以立即使用正常的降级过程进行降级。