#### 17.1.4.2 在线启用 GTID 交易

[](<>)

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

从 MySQL 8.0.23 开始，您可以设置复制通道以将 GTID 分配给尚未复制的事务。此功能允许从不使用基于 GTID 的复制的源服务器复制到使用基于 GTID 的副本。如果可以在复制源服务器上启用 GTID，如本过程中所述，请改用此方法。分配 GTID 专为无法启用 GTID 的复制源服务器而设计。有关此选项的更多信息，请参阅[第 17.1.3.6 节，“从没有 GTID 的源复制到具有 GTID 的副本”](replication-gtids-assign-anon.html).

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

-   *全部*拓扑中的服务器必须使用 MySQL 5.7.6 或更高版本。您不能在任何单个服务器上在线启用 GTID 事务，除非*全部*拓扑中的服务器正在使用此版本。

-   所有服务器都有[`gtid_mode`](replication-options-gtids.html#sysvar_gtid_mode)设置为默认值`离开`.

    下面的过程可以随时暂停，然后从原处恢复，或者通过跳转到相应的步骤来反转[第 17.1.4.3 节，“禁用在线 GTID 事务”](replication-mode-change-online-disable-gtids.html)，禁用 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 之前生成的所有事务复制到所有服务器。您可以在不停止更新的情况下执行此操作：唯一重要的是所有匿名事务都会被复制。

    看[第 17.1.4.4 节，“验证匿名交易的复制”](replication-mode-change-online-verify-transactions.html)检查所有匿名事务是否已复制到所有服务器的一种方法。

7.  如果您将二进制日志用于复制以外的任何事情，例如时间点备份和恢复，请等到您不需要具有没有 GTID 的事务的旧二进制日志。

    例如，在第 6 步完成后，您可以执行[`刷新日志`](flush.html#flush-logs)在您进行备份的服务器上。然后要么明确地进行备份，要么等待您可能设置的任何定期备份例程的下一次迭代。

    理想情况下，等待服务器清除步骤 6 完成时存在的所有二进制日志。还要等待在第 6 步之前进行的任何备份到期。

    重要的

    这是第二个重要的点。了解包含匿名事务且没有 GTID 的二进制日志在下一步之后无法使用是至关重要的。在此步骤之后，您必须确保没有 GTID 的事务不存在于拓扑中的任何位置。

8.  在每台服务器上，执行：

    ```
    SET @@GLOBAL.GTID_MODE = ON;
    ```

9.  在每台服务器上，添加`gtid_mode=ON`和`enforce_gtid_consistency=ON`到`我的.cnf`.

    您现在可以保证所有交易都有一个 GTID（除了在第 5 步或更早的步骤中生成的已处理的交易）。要开始使用 GTID 协议以便稍后执行自动故障转移，请在每个副本上执行以下操作。或者，如果您使用多源复制，请为每个通道执行此操作并包括`对于频道 *`渠道`*`条款：

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

    Or from MySQL 8.0.22 / 8.0.23:
    STOP REPLICA [FOR CHANNEL 'channel'];
    CHANGE REPLICATION SOURCE TO SOURCE_AUTO_POSITION = 1 [FOR CHANNEL 'channel'];
    START REPLICA [FOR CHANNEL 'channel'];
    ```
