您可以设置复制通道,为没有 GTID 的复制事务分配 GTID。此功能允许从没有启用 GTID 且不使用基于 GTID 的复制的源服务器复制到已启用 GTID 的副本服务器。如果可以像在 第 19.1.4 节,“在线更改 GTID 模式” 中所述那样在复制源服务器上启用 GTID,请使用该方法。此功能专为无法启用 GTID 的复制源服务器设计。请注意,与 MySQL 复制的标准一样,此功能不支持从早于先前发行系列的 MySQL 源服务器复制,因此 MySQL 8.4 是 MySQL 9.0 副本服务器支持的最早源服务器。
您可以使用 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 通常会在事务提交时在复制源服务器上分配,并与事务一起发送到副本。在多线程副本上,这意味着即使
replica_preserve_commit_order
= 1,GTID 的顺序也不一定与事务的顺序匹配。CHANGE REPLICATION SOURCE TO
语句的SOURCE_LOG_FILE
和SOURCE_LOG_POS
选项用于定位复制 I/O(接收器)线程,而不是SOURCE_AUTO_POSITION
选项。SET GLOBAL sql_replica_skip_counter
语句用于跳过在使用ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
设置的复制通道上进行的事务,而不是提交空事务的方法。有关说明,请参见 第 19.1.7.3 节,“跳过事务”。START REPLICA
语句的UNTIL SQL_BEFORE_GTIDS
和UNTIL_SQL_AFTER_GTIDS
选项不能用于该通道。函数
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
语句不会重置。