19.1.3.6 从源服务器没有GTID到GTID支持的副本服务器
您可以使用复制通道来为未经GTID标识的交易分配GTID。这项功能使得可以从不支持GTID的源服务器复制数据到支持GTID的副本服务器。如果可能,请在源服务器上启用GTID,如第19.1.4节,“在线更改GTID模式”中所述。该功能旨在为无法在源服务器上启用GTID的场景设计。请注意,这项功能不支持从早于前一个发布系列的MySQL源服务器复制数据,因此MySQL 8.3是最早支持的源服务器版本。
您可以使用ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
选项在复制通道上启用GTID分配。LOCAL
将GTID分配到包括副本服务器的UUID(server_uuid
设置)。
将GTID分配到指定的UUID,例如副本服务器的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
和不使用该选项的通道。对于Group Replication的通道,不能使用ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
,但是在Group Replication组成员服务器上可以使用异步复制通道来使用该选项。在Group Replication组成员服务器上的通道中,不要指定Group Replication组名作为UUID以创建GTIDs。
使用 ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
在复制通道上不是将 GTID-基于的复制引入该通道。该 GTID 集合(gtid_executed
)来自于使用 ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
的副本,不应该在另一个服务器或与另一个服务器的 gtid_executed
集合进行转移或比较。分配给匿名事务的 GTIDs,以及您为它们选择的 UUID,只对该副本的本地使用有意义。除非是该副本的下游副本或从该副本备份创建的服务器。
如果您设置了下游副本,这些服务器不具有 ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
功能。只有直接从非 GTID 服务器接收事务的副本需要在相关的复制通道上设置 ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
。在该副本和其下游副本之间,您可以比较 GTID 集合、失败转移到另一个副本、使用备份创建更多副本,就像在任何 GTID-基于的复制拓扑结构中一样。ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
在外部服务器外部接收事务的地方使用。
使用 ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
的复制通道具有以下行为差异与 GTID-基于的复制:
-
GTIDs 将在事务被应用时分配(除非事务已经有了 GTID)。通常情况下,GTID 在事务提交时在源服务器上分配,并与事务一起发送到副本上。在多线程副本上,这意味着 GTIDs 的顺序不一定与事务的顺序相符,即使
replica_preserve_commit_order
= 1。 -
SOURCE_LOG_FILE
和SOURCE_LOG_POS
选项的CHANGE REPLICATION SOURCE TO
语句用于定位复制 I/O(接收)线程,而不是SOURCE_AUTO_POSITION
选项。 -
SET GLOBAL sql_replica_skip_counter
语句用于在使用ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
的复制通道上跳过事务,而不是提交空事务。请参阅 第19.1.7.3节,“跳过事务”。 -
UNTIL SQL_BEFORE_GTIDS
和UNTIL_SQL_AFTER_GTIDS
选项的START REPLICA
语句不能用于该通道。 -
函数
WAIT_FOR_EXECUTED_GTID_SET()
可以跨服务器工作,可以用来等待服务器的任何下游副本,如果这些副本启用了ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
。要等待具有ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
启用的通道与源同步,可以使用SOURCE_POS_WAIT()
函数。
性能Schemareplication_applier_configuration
表显示了 replication 通道上是否将 GTIDs 分配给匿名事务,UUID 是什么,以及它是 replica 服务器的 UUID (LOCAL
)还是用户指定的 UUID (UUID
). 这些信息也记录在 applier 元数据存储库中。一个RESET REPLICA ALL
语句重置了ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS
设置,但是RESET REPLICA
语句不可以。