#### 17.1.4.3 在线禁用 GTID 交易

[](<>)

本节介绍如何在已在线的服务器上禁用 GTID 事务。此过程不需要使服务器脱机，适合在生产中使用。但是，如果您有可能在禁用 GTID 模式时使服务器脱机，则该过程会更容易。

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

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

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

-   所有服务器都有[`gtid_mode`](replication-options-gtids.html#sysvar_gtid_mode)调成`在`.

-   这[`--replicate-same-server-id`](replication-options-replica.html#option_mysqld_replicate-same-server-id)选项未在任何服务器上设置。如果此选项与[`--log-slave-updates`](replication-options-binary-log.html#sysvar_log_slave_updates)选项（这是默认值）并启用二进制日志记录（这也是默认值）。如果没有 GTID，这种选项组合会导致循环复制中的无限循环。

1.  在每个副本上执行以下操作，如果您使用的是多源复制，请为每个通道执行此操作并包含`频道`渠道条款：

    ```
    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'];

    Or from MySQL 8.0.22 / 8.0.23:
    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.  在每台服务器上，等到变量 @@GLOBAL.GTID_OWNED 等于空字符串。这可以使用以下方法进行检查：

    ```
    SELECT @@GLOBAL.GTID_OWNED;
    ```

    在副本上，理论上它可能是空的，然后又是非空的。这不是问题，只要它是空的就足够了。

5.  等待任何二进制日志中当前存在的所有事务复制到所有副本。看[第 17.1.4.4 节，“验证匿名交易的复制”](replication-mode-change-online-verify-transactions.html)检查所有匿名事务是否已复制到所有服务器的一种方法。

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

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

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

    重要的

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

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

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

8.  在每台服务器上，设置[`gtid_mode=OFF`](replication-options-gtids.html#sysvar_gtid_mode)在`我的.cnf`.

    如果你想设置[`enforce_gtid_consistency=OFF`](replication-options-gtids.html#sysvar_enforce_gtid_consistency), 你现在可以这样做了。设置后，您应该添加[`enforce_gtid_consistency=OFF`](replication-options-gtids.html#sysvar_enforce_gtid_consistency)到你的配置文件。

    如果您想降级到早期版本的 MySQL，您现在可以使用正常的降级过程进行。
