Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  Enabling GTID Transactions Online

19.1.4.2 在线启用 GTID 事务

本节描述了如何在线启用 GTID 事务,并可选地启用自动定位,用于已经在线运行的服务器,这些服务器当前使用匿名事务。这个过程不需要停机服务器,并且适用于生产环境。但是,如果您可以在启用 GTID 事务时将服务器停机,这个过程将更简单。

您可以设置复制通道,以将 GTIDs 分配给未经分配的复制事务。这项功能使得可以从不使用 GTID 基础复制的源服务器到使用 GTID 的副本服务器。如果可能,请在源服务器上启用 GTIDs,如本过程所述,使用这个方法代替。分配 GTIDs 是为无法在源服务器上启用 GTIDs 的情况设计的。有关这个选项的更多信息,请见第19.1.3.6节,“从不使用 GTID 的源服务器到使用 GTID 的副本服务器”

在开始之前,请确保gtid_mode在所有服务器上设置为OFF

以下过程可以在任何时候暂停,并在后续恢复到相应的步骤第19.1.4.3节,“在线禁用 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_count0。您可以使用SHOW STATUS语句来检查该值,如下所示:

    mysql> SHOW STATUS LIKE 'Ongoing%';
    +-------------------------------------+-------+
    | Variable_name                       | Value |
    +-------------------------------------+-------+
    | Ongoing_anonymous_transaction_count | 0     |
    +-------------------------------------+-------+
    1 row in set (0.00 sec)

    在副本服务器上,理论上可能出现0然后是非零值。这不是问题,只要在某个时候是0

  6. 等待所有生成到前一个步骤的交易复制到所有服务器上。您可以在不停止更新的情况下执行该步骤;关键是所有匿名事务都被复制到所有服务器上,然后才能继续执行下一个步骤。

    查看第19.1.4.4节,“验证匿名事务的复制”以了解如何检查所有匿名事务是否已经复制到所有服务器上。

  7. 如果您使用二进制日志来实现其他功能,例如点时刻备份和恢复,等待您不再需要包含无GTID事务的旧二进制日志。

    例如,在所有事务都已经复制完成后,您可以在备份服务器上执行FLUSH LOGS。然后,您可以显式地备份或等待下一个备份计划的下一个迭代。

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

    请注意,包含匿名事务的二进制日志(即无GTID事务)在下一步后不能使用。在下一步后,您必须确保在任何服务器上没有未提交的无GTID事务。

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

    SET @@GLOBAL.GTID_MODE = ON;
  9. 在每个服务器上,在my.cnf文件中添加gtid-mode=ONenforce-gtid-consistency=ON。这确保了GTID将用于所有已经处理的交易。要使用GTID协议,以便在将来执行自动故障转移,请在每个副本上执行以下语句。如果您使用多源复制,执行以下语句对每个通道,包括FOR CHANNEL channel子句:

    STOP REPLICA [FOR CHANNEL 'channel'];
    
    CHANGE REPLICATION SOURCE TO SOURCE_AUTO_POSITION = 1 [FOR CHANNEL 'channel'];
    
    START REPLICA [FOR CHANNEL 'channel'];