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_mode和enforce_gtid_consistency变量现在都是动态的,并且可以由具有足以设置全局系统变量的特权的帐户从顶级语句中进行设置。参见第 5.1.8.1 节“系统变量特权”。在以前的版本中,只能在服务器启动时使用适当的选项来配置这两个变量,这意味着更改复制模式需要重新启动服务器。在所有版本中,gtid_mode都可以设置为ON
或OFF
,这与是否使用 GTID 标识 Transaction 是相对应的。在gtid_mode=ON时,无法复制匿名事务,在gtid_mode=OFF时,只能复制匿名事务。从 MySQL 5.7.6 开始,gtid_mode变量具有两个附加状态OFF_PERMISSIVE
和ON_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
,则可以更改为OFF
或ON_PERMISSIVE
,但不能更改为ON
。这是为了确保服务器正确处理从匿名事务到在线 GTID 事务的转换过程。在gtid_mode=ON和gtid_mode=OFF之间切换时,GTID 状态(即gtid_executed的值)将保持不变。这样可以确保始终保留服务器已应用的 GTID 集,而不管gtid_mode类型之间的更改如何。
作为 MySQL 5.7.6 引入的更改的一部分,与 GTID 相关的字段已经过修改,因此无论当前选择的gtid_mode为何,它们都显示正确的信息。这意味着在不存在 GTID 的情况下,显示replication_connection_status Performance Schematable 中gtid_executed,gtid_purged,RECEIVED_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 |
---|---|---|---|---|
副本OFF | Y | Y | N | N |
副本OFF_PERMISSIVE | Y | Y | Y | Y* |
副本ON_PERMISSIVE | Y | Y | Y | Y* |
副本ON | N | N | Y | Y* |
在上 table 中,条目为:
当前选择的gtid_mode也影响gtid_next变量。下 table 显示了gtid_mode和gtid_next不同值时服务器的行为。
table16.2 gtid_mode 和 gtid_next 的有效组合
gtid_next | AUTOMATIC 二进制登录 | 自动 二进制注销 | ANONYMOUS | UUID:NUMBER |
---|---|---|---|---|
>OFF | ANONYMOUS | ANONYMOUS | ANONYMOUS | Error |
>OFF_PERMISSIVE | ANONYMOUS | ANONYMOUS | ANONYMOUS | UUID:NUMBER |
>ON_PERMISSIVE | New GTID | ANONYMOUS | ANONYMOUS | UUID:NUMBER |
>ON | New GTID | ANONYMOUS | Error | UUID:NUMBER |
在上 table 中,条目为:
-
ANONYMOUS
:生成匿名 Transaction。 -
Error
:产生错误,无法执行SET GTID_NEXT
。 -
UUID:NUMBER
:使用指定的 UUID:NUMBER 生成 GTID。 -
New GTID
:使用自动生成的编号生成 GTID。
当二进制日志关闭并且gtid_next设置为AUTOMATIC
时,则不会生成 GTID。这与先前版本的行为一致。