您可以设置复制通道以将 GTID 分配给尚未拥有 GTID 的复制事务。此功能允许从没有启用 GTID 且不使用基于 GTID 的复制的源服务器复制到已启用 GTID 的副本。如果可以在复制源服务器上启用 GTID,如第 19.1.4 节,“在线更改 GTID 模式” 中所述,请改用这种方法。此功能专为无法启用 GTID 的复制源服务器而设计。请注意,作为 MySQL 复制的标准,此功能不支持从早于先前发布系列的 MySQL 源服务器进行复制,因此 MySQL 8.3 是 MySQL 8.4 副本支持的最早源服务器。
您可以使用CHANGE REPLICATION SOURCE TO
语句的 ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
选项在复制通道上启用 GTID 分配。 LOCAL
分配一个包含副本自身 UUID(server_uuid
设置)的 GTID。
分配一个包含指定 UUID 的 GTID,例如复制源服务器的 uuid
server_uuid
设置。使用非本地 UUID 可以区分源头产生的事务和副本产生的事务,对于多源副本,还可以区分不同源头产生的事务。如果源发送的任何事务已拥有 GTID,则保留该 GTID。
在任何通道上使用 ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
设置的副本不能在需要故障转移的情况下提升以替换复制源服务器,并且不能使用从副本中提取的备份来还原复制源服务器。相同的限制适用于替换或还原使用任何通道上的 ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
的其他副本。
副本必须设置 gtid_mode=ON
,并且此设置不能更改,除非您设置 ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS=OFF
。如果副本服务器启动时没有启用 GTID 并且任何复制通道都设置了 ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
,则不会更改这些设置,但会向错误日志写入警告消息,说明如何更改此情况。
对于多源副本,您可以混合使用使用 ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
的通道和不使用的通道。特定于组复制的通道不能使用 ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
,但作为组复制组成员的服务器实例上的另一个源的异步复制通道可以使用。对于组复制组成员上的通道,请勿将组复制组名称指定为创建 GTID 的 UUID。
在复制通道上使用 ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
并不等同于为该通道引入基于 GTID 的复制。使用 ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
设置的副本集的 GTID 集(gtid_executed
)不应该被传输到其他服务器或与其他服务器的 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 的顺序不一定与事务的顺序匹配,即使
replica_preserve_commit_order
= 1。CHANGE REPLICATION SOURCE TO
用于在使用
ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
设置的复制通道上跳过事务,而不是使用提交空事务的方法。有关说明,请参见 第 19.1.7.3 节,“跳过事务”.START REPLICA
函数
WAIT_FOR_EXECUTED_GTID_SET()
在整个服务器上工作,可以用来等待启用了ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
的服务器的任何下游副本。要等待使用ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
设置的通道赶上不使用 GTID 的源服务器,请使用SOURCE_POS_WAIT()
函数。
Performance Schema replication_applier_configuration
表显示了是否在复制通道上将 GTID 分配给匿名事务,UUID 是什么,以及它是否是副本服务器的 UUID(LOCAL
)还是用户指定的 UUID(UUID
)。该信息也会记录在应用器元数据存储库中。 RESET REPLICA ALL
语句会重置 ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
设置,但 RESET REPLICA
语句不会。