#### 17.1.3.6 从没有 GTID 的源复制到有 GTID 的副本

[](<>)

从 MySQL 8.0.23 开始，您可以设置复制通道以将 GTID 分配给尚未复制的事务。此功能允许从未启用 GTID 且不使用基于 GTID 的复制的源服务器复制到已启用 GTID 的副本。如果可以在复制源服务器上启用 GTID，如中所述[第 17.1.4 节，“更改在线服务器上的 GTID 模式”](replication-mode-change-online.html)，改为使用该方法。此功能专为无法启用 GTID 的复制源服务器而设计。请注意，作为 MySQL 复制的标准，此功能不支持从早于上一个版本系列的 MySQL 源服务器进行复制，因此 MySQL 5.7 是 MySQL 8.0 副本最早支持的源。

您可以使用在复制通道上启用 GTID 分配`ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS`的选项[`将复制源更改为`](change-replication-source-to.html)陈述。`当地的`分配一个 GTID，包括副本自己的 UUID（[`server_uuid`](replication-options.html#sysvar_server_uuid)环境）。`*`uuid`*`分配一个包含指定 UUID 的 GTID，例如[`server_uuid`](replication-options.html#sysvar_server_uuid)复制源服务器的设置。使用非本地 UUID 可以区分源自副本的事务和源自源的事务，对于多源副本，可以区分源自不同源的事务。如果源发送的任何事务确实已经具有 GTID，则保留该 GTID。

重要的

一个副本设置`ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS`在需要故障转移的情况下，不能提升任何通道上的复制源服务器以替换复制源服务器，并且从副本中获取的备份不能用于恢复复制源服务器。同样的限制适用于替换或恢复其他使用`ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS`在任何频道上。

副本必须有[`gtid_mode=ON`](replication-options-gtids.html#sysvar_gtid_mode)设置，并且以后不能更改，除非您删除`ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS=ON`环境。如果副本服务器在未启用 GTID 的情况下启动并且`ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS`为任何复制通道设置，设置不会更改，但会在错误日志中写入一条警告消息，说明如何更改情况。

对于多源副本，您可以混合使用的通道`ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS`，以及没有的频道。无法使用特定于组复制的通道`ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS`，但作为组复制组成员的服务器实例上的另一个源的异步复制通道可以这样做。对于组复制组成员上的通道，请勿将组复制组名称指定为用于创建 GTID 的 UUID。

使用`ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS`在复制通道上与为通道引入基于 GTID 的复制不同。GTID 集 ([`gtid_executed`](replication-options-gtids.html#sysvar_gtid_executed)) 从一个副本设置`ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS`不应转移到另一台服务器或与另一台服务器的比较[`gtid_executed`](replication-options-gtids.html#sysvar_gtid_executed)放。分配给匿名事务的 GTID 以及您为它们选择的 UUID 仅对该副本自己的使用有意义。例外情况是您启用的副本的任何下游副本`ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS`，以及从该副本的备份创建的任何服务器。

如果您设置任何下游副本，这些服务器没有`ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS`启用。只有直接从非 GTID 源服务器接收事务的副本才需要具有`ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS`在相关的复制通道上设置。在该副本及其下游副本中，您可以比较 GTID 集，从一个副本故障转移到另一个副本，并使用备份来创建其他副本，就像在任何基于 GTID 的复制拓扑中一样。`ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS`用于从该组之外的非 GTID 服务器接收事务的情况。

使用复制通道`ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS`与基于 GTID 的复制有以下行为差异：

-   GTID 在应用时分配给复制的事务（除非它们已经有 GTID）。提交事务时，通常会在复制源服务器上分配 GTID，并与事务一起发送到副本。在多线程副本上，这意味着 GTID 的顺序不一定与事务的顺序相匹配，即使[`slave-preserve-commit-order=1`](replication-options-replica.html#sysvar_slave_preserve_commit_order)已设置。

-   这`SOURCE_LOG_FILE`和`SOURCE_LOG_POS`的选项[`将复制源更改为`](change-replication-source-to.html)语句用于定位复制 I/O（接收器）线程，而不是`SOURCE_AUTO_POSITION`选项。

-   这`设置全局 sql_replica_skip_counter`要么`设置全局 sql_slave_skip_counter`语句用于跳过设置的复制通道上的事务`ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS`，而不是提交空事务的方法。有关说明，请参阅[第 17.1.7.3 节，“跳过事务”](replication-administration-skip.html).

-   这`直到 SQL_BEFORE_GTIDS`和`UNTIL_SQL_AFTER_GTIDS`的选项[`开始复制`](start-replica.html)声明不能用于通道。

-   功能`WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS()`，从 MySQL 8.0.18 中被弃用，不能与通道一起使用。它的替代品`WAIT_FOR_EXECUTED_GTID_SET()`，它在服务器上工作，可用于等待服务器的任何下游副本`ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS`启用。等待频道`ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS`启用以赶上不使用 GTID 的源，使用`SOURCE_POS_WAIT()`函数（来自 MySQL 8.0.26）或`MASTER_POS_WAIT()`功能。

    性能模式表[`复制应用程序配置`](performance-schema-replication-applier-configuration-table.html)显示 GTID 是否分配给复制通道上的匿名事务，UUID 是什么，以及它是否是副本服务器的 UUID (`当地的`) 或用户指定的 UUID (`手动的`）。该信息也记录在应用程序元数据存储库中。一种[`全部重置副本`](reset-replica.html)语句重置`ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS`设置，但一个[`重置副本`](reset-replica.html)声明没有。
