16.1.4.1 复制模式概念

为了能够安全地配置联机服务器的复制模式,理解复制的一些关键概念很重要。本节介绍了这些概念,是在尝试修改联机服务器的复制模式之前的必读内容。

MySQL 中可用的复制模式依赖于不同的技术来识别已记录的事务。复制使用的事务类型如下:

  • GTID 事务由格式为UUID:NUMBER的全局事务标识符(GTID)标识。日志中的每个 GTID 事务始终以Gtid_log_event开头。可以使用 GTID 或使用文件名和位置来解决 GTID 事务。

  • 匿名事务未分配 GTID,MySQL 确保日志中的每个匿名事务都带有Anonymous_gtid_log_event。在以前的版本中,匿名事务之前没有任何特定事件。只能使用文件名和位置来解决匿名事务。

使用 GTID 时,您可以利用自动定位和自动故障转移的功能,还可以使用WAIT_FOR_EXECUTED_GTID_SET()session_track_gtids并使用 Performance Schematable 监视复制的事务。启用 GTID 后,您不能使用sql_slave_skip_counter,而可以使用空事务。

从运行早期版本的 MySQL 的源接收到的中继日志中的事务可能根本没有任何特定事件发生,但是在重播并记录在副本的二进制日志中之后,它们前面带有Anonymous_gtid_log_event

在线配置复制模式的能力意味着gtid_modeenforce_gtid_consistency变量现在都是动态的,并且可以由具有足以设置全局系统变量的特权的帐户从顶级语句中进行设置。参见第 5.1.8.1 节“系统变量特权”。在以前的版本中,只能在服务器启动时使用适当的选项来配置这两个变量,这意味着更改复制模式需要重新启动服务器。在所有版本中,gtid_mode都可以设置为ONOFF,这与是否使用 GTID 标识 Transaction 是相对应的。在gtid_mode=ON时,无法复制匿名事务,在gtid_mode=OFF时,只能复制匿名事务。从 MySQL 5.7.6 开始,gtid_mode变量具有两个附加状态OFF_PERMISSIVEON_PERMISSIVE。当gtid_mode=OFF_PERMISSIVE时,* new 事务为匿名,同时允许复制的事务为 GTID 或匿名事务。当gtid_mode=ON_PERMISSIVE时, new *事务使用 GTID,同时允许复制的事务为 GTID 或匿名事务。这意味着可能有一个复制拓扑,其中包含使用匿名事务和 GTID 事务的服务器。例如,具有gtid_mode=ON的源可以复制到具有gtid_mode=ON_PERMISSIVE的副本。 gtid_mode的有效值如下,并按此 Sequences:

  • OFF

  • OFF_PERMISSIVE

  • ON_PERMISSIVE

  • ON

重要的是要注意,根据上述 Sequences,gtid_mode的状态一次只能一次更改。例如,如果gtid_mode当前设置为OFF_PERMISSIVE,则可以更改为OFFON_PERMISSIVE,但不能更改为ON。这是为了确保服务器正确处理从匿名事务到在线 GTID 事务的转换过程。在gtid_mode=ONgtid_mode=OFF之间切换时,GTID 状态(即gtid_executed的值)将保持不变。这样可以确保始终保留服务器已应用的 GTID 集,而不管gtid_mode类型之间的更改如何。

作为 MySQL 5.7.6 引入的更改的一部分,与 GTID 相关的字段已经过修改,因此无论当前选择的gtid_mode为何,它们都显示正确的信息。这意味着在不存在 GTID 的情况下,显示replication_connection_status Performance Schematable 中gtid_executedgtid_purgedRECEIVED_TRANSACTION_SET之类的 GTID 集的字段以及显示从站状态的 GTID 相关结果现在返回空字符串。现在,当不使用 GTID 事务时,显示单个 GTID 的字段(例如,性能模式replication_applier_status_by_workertable 中的CURRENT_TRANSACTION)将显示ANONYMOUS

使用gtid_mode=ON从源进行复制可以使用通过CHANGE MASTER TO MASTER_AUTO_POSITION = 1;语句配置的自动定位功能。使用的复制拓扑会影响是否可以启用自动定位,因为此功能依赖于 GTID,并且与匿名事务不兼容。如果启用自动定位并遇到匿名事务,则会生成错误。强烈建议在启用自动定位之前确保拓扑中没有剩余匿名事务,请参见第 16.1.4.2 节,“在线启用 GTID 事务”。下 table 中显示了gtid_mode以及在源和副本上自动定位的有效组合,其中源的gtid_mode在水平方向上显示,副本的gtid_mode在垂直方向上:

table16.1 源和副本 gtid_mode 的有效组合

gtid_mode来源OFF来源OFF_PERMISSIVE来源ON_PERMISSIVE来源ON
副本OFFYYNN
副本OFF_PERMISSIVEYYYY*
副本ON_PERMISSIVEYYYY*
副本ONNNYY*

在上 table 中,条目为:

  • Y:源和副本的gtid_mode兼容

  • N:源和副本的gtid_mode不兼容

  • *:可以使用自动定位

当前选择的gtid_mode也影响gtid_next变量。下 table 显示了gtid_modegtid_next不同值时服务器的行为。

table16.2 gtid_mode 和 gtid_next 的有效组合

gtid_nextAUTOMATIC
二进制登录
自动
二进制注销
ANONYMOUSUUID:NUMBER
>OFFANONYMOUSANONYMOUSANONYMOUSError
>OFF_PERMISSIVEANONYMOUSANONYMOUSANONYMOUSUUID:NUMBER
>ON_PERMISSIVENew GTIDANONYMOUSANONYMOUSUUID:NUMBER
>ONNew GTIDANONYMOUSErrorUUID:NUMBER

在上 table 中,条目为:

  • ANONYMOUS:生成匿名 Transaction。

  • Error:产生错误,无法执行SET GTID_NEXT

  • UUID:NUMBER:使用指定的 UUID:NUMBER 生成 GTID。

  • New GTID:使用自动生成的编号生成 GTID。

当二进制日志关闭并且gtid_next设置为AUTOMATIC时,则不会生成 GTID。这与先前版本的行为一致。