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

    本节介绍如何在已经联机并且使用匿名事务的服务器上启用GTID事务以及有选择地自动定位。此过程不需要使服务器脱机,并且适合在生产中使用。但是,如果在启用GTID事务时可以使服务器脱机,则处理过程会更容易。

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

    • 拓扑中的所有服务器都必须使用MySQL 5.7.6或更高版本。除非拓扑中的所有服务器都使用此版本,否则您不能在任何单个服务器上在线启用GTID事务。
    • 所有服务器均gtid_mode设置为默认值OFF

    可以随时暂停以下过程,之后将其恢复原处,或者通过跳转到“在线禁用GTID交易”(禁用GTID的在线过程)中的相应步骤来恢复该过程。这使得该过程具有容错性,因为可以照常处理过程中间可能出现的任何无关的问题,然后继续执行该过程。

    注意

    在继续下一步之前,完成每一步至关重要。

    启用GTID交易:

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

      SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = WARN;
      

      让服务器在正常工作量下运行一段时间并监视日志。如果此步骤在日志中引起任何警告,请调整您的应用程序,使其仅使用与GTID兼容的功能,并且不会生成任何警告。

      重要

      这是重要的第一步。您必须确保在继续下一步之前在错误日志中未生成任何警告。

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

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

      SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;
      

      哪个服务器首先执行此语句并不重要,但是重要的是所有服务器都必须先完成此步骤,然后任何服务器才开始执行下一步。

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

      SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE;
      

      哪个服务器先执行此语句并不重要。

    5. 在每台服务器上,等待状态变量ONGOING_ANONYMOUS_TRANSACTION_COUNT为零。可以使用以下方法进行检查:

      SHOW STATUS LIKE 'ONGOING_ANONYMOUS_TRANSACTION_COUNT';
      
      注意

      在复制从属服务器上,从理论上讲,这有可能显示为零,然后再次显示为非零。这不是问题,只要显示一次为零即可。

    6. 等待直到步骤5生成的所有事务复制到所有服务器。您可以在不停止更新的情况下执行此操作:唯一重要的是复制所有匿名事务。

      有关检查所有匿名事务是否已复制到所有服务器的一种方法,请参见“验证匿名事务的复制”。

    7. 如果您将二进制日志用于复制以外的其他用途(例如,时间点备份和还原),请等到不需要具有不带GTID的事务的旧二进制日志。

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

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

      重要

      这是第二个重点。至关重要的是要了解,下一步之后就不能使用没有GTID的包含匿名事务的二进制日志。完成此步骤后,必须确保没有GTID的事务在拓扑中的任何地方都不存在。

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

      SET @@GLOBAL.GTID_MODE = ON;
      
    9. 在每个服务器上,将gtid_mode=ON和添加enforce_gtid_consistency=ONmy.cnf

      现在,您可以确保所有事务都具有GTID(步骤5或更早版本中生成的事务已被处理)。要开始使用GTID协议以便以后可以执行自动故障转移,请在每个从站上执行以下命令。(可选)如果使用多源复制,请对每个通道执行此操作,并包含以下子句:FOR CHANNEL channel

      STOP SLAVE [FOR CHANNEL 'channel'];
      CHANGE MASTER TO MASTER_AUTO_POSITION = 1 [FOR CHANNEL 'channel'];
      START SLAVE [FOR CHANNEL 'channel'];