Documentation Home
MySQL 8.0 参考手册  / 第十七章复制  / 17.1 配置复制  / 17.1.3 使用全局事务标识符进行复制  /  17.1.3.6 从没有 GTID 的源复制到有 GTID 的副本

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

从 MySQL 8.0.23 开始,您可以设置复制通道以将 GTID 分配给还没有复制事务的复制事务。此功能支持从未启用 GTID 且未使用基于 GTID 的复制的源服务器复制到已启用 GTID 的副本。如果可以在复制源服务器上启用 GTID,如 第 17.1.4 节“更改在线服务器上的 GTID 模式”中所述,请改用该方法。此功能专为无法启用 GTID 的复制源服务器而设计。请注意,作为 MySQL 复制的标准,此功能不支持从早于先前版本系列的 MySQL 源服务器进行复制,因此 MySQL 5.7 是 MySQL 8.0 副本最早支持的源。

您可以使用语句的ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS选项 在复制通道上启用 GTID 分配 。分配一个 GTID,包括副本自己的 UUID( 设置)。 分配一个 GTID,包括指定的 UUID,例如 复制源服务器的设置。使用非本地 UUID 可以区分起源于副本的事务和起源于源的事务,对于多源副本,可以区分起源于不同源的事务。如果源发送的任何事务确实已经具有 GTID,则保留该 GTID。 CHANGE REPLICATION SOURCE TOLOCALserver_uuiduuidserver_uuid

重要的

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

副本必须已 gtid_mode=ON设置,并且此后无法更改,除非您删除该 ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS=ON 设置。如果副本服务器在没有启用 GTID 且ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS 为任何复制通道设置的情况下启动,则设置不会更改,但会向错误日志写入一条警告消息,说明如何更改这种情况。

对于多源副本,您可以混合使用ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS和不使用 的通道。特定于 Group Replication 的通道不能使用 ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS,但作为 Group Replication 组成员的服务器实例上另一个源的异步复制通道可以这样做。对于组复制组成员上的通道,请勿将组复制组名称指定为用于创建 GTID 的 UUID。

在复制通道上使用ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS与为通道引入基于 GTID 的复制不同。gtid_executed副本设置中 的 GTID 集 ( )ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS不应传输到另一台服务器或与另一台服务器的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 已设置。

  • 该语句的SOURCE_LOG_FILESOURCE_LOG_POS选项 CHANGE REPLICATION SOURCE TO 用于定位复制I/O(接收方)线程,而不是 SOURCE_AUTO_POSITION选项。

  • SET GLOBAL sql_replica_skip_counteror SET GLOBAL sql_slave_skip_counter语句用于跳过设置的复制通道上的事务 ,ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS而不是提交空事务的方法。有关说明,请参阅 第 17.1.7.3 节,“跳过事务”

  • 该语句的UNTIL SQL_BEFORE_GTIDSUNTIL_SQL_AFTER_GTIDS选项 START REPLICA不能用于通道。

  • 从 MySQL 8.0.18 开始弃用的函数 WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS()不能与通道一起使用。它的替代品 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 表显示 GTID 是否分配给复制通道上的匿名事务,UUID 是什么,以及它是副本服务器的 UUID ( LOCAL) 还是用户指定的 UUID ( UUID)。该信息也记录在应用程序元数据存储库中。RESET REPLICA ALL语句重置 设置, ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONSRESET REPLICA语句不会。