为了能够安全地配置在线服务器的复制模式,了解复制的一些关键概念非常重要。本节解释了这些概念,是尝试修改在线服务器的复制模式之前的必备阅读材料。
MySQL 中可用的复制模式依赖于不同的技术来识别记录的事务。复制使用的事务类型如下:
- GTID 事务由格式为 的全局事务标识符 (GTID) 标识
UUID:NUMBER
。日志中的每个 GTID 事务总是以Gtid_log_event
. GTID 事务可以使用 GTID 或使用文件名和位置来处理。 - 匿名事务没有分配 GTID,MySQL 确保日志中的每个匿名事务前面都有一个
Anonymous_gtid_log_event
. 在以前的版本中,匿名交易之前没有任何特定事件。匿名事务只能使用文件名和位置来处理。
使用 GTID 时,您可以利用 GTID 自动定位和自动故障转移,以及使用 WAIT_FOR_EXECUTED_GTID_SET()
、 session_track_gtids
和监视使用性能模式表的复制事务。
从运行先前版本 MySQL 的源接收到的中继日志中的事务可能根本没有任何特定事件,但是在被重放并记录在副本的二进制日志中之后,它们前面有一个 Anonymous_gtid_log_event
.
在线配置复制模式的能力意味着gtid_mode
和 enforce_gtid_consistency
变量现在都是动态的,并且可以由具有足以设置全局系统变量的权限的帐户从顶级语句中设置。请参见 第 5.1.9.1 节,“系统变量权限”。在 MySQL 5.6 和更早版本中,这两个变量只能在服务器启动时使用适当的选项进行配置,这意味着对复制模式的更改需要重新启动服务器。在所有版本 gtid_mode
中都可以设置为 ON
或OFF
,这对应于 GTID 是否用于识别事务。什么时候gtid_mode=ON
无法复制匿名事务,并且 gtid_mode=OFF
只能复制匿名事务。那时 新gtid_mode=OFF_PERMISSIVE
事务是匿名的, 同时允许复制事务是 GTID 或匿名事务。届时 , 新事务使用 GTID,同时允许复制事务为 GTID 或匿名事务。这意味着可以有一个复制拓扑,其中包含使用匿名和 GTID 事务的服务器。例如,带有 的源 可以复制到带有 的副本 。的有效值如下所示,并按以下顺序排列: gtid_mode=ON_PERMISSIVE
gtid_mode=ON
gtid_mode=ON_PERMISSIVE
gtid_mode
OFF
OFF_PERMISSIVE
ON_PERMISSIVE
ON
需要注意的是, gtid_mode
根据上面的顺序,一次只能改变一个步骤的状态。例如,如果 gtid_mode
当前设置为 OFF_PERMISSIVE
,则可以更改为 OFF
或ON_PERMISSIVE
但不能更改为ON
。这是为了确保服务器正确处理从匿名交易到在线GTID交易的过程。gtid_mode=ON
当您在和 之间切换时 gtid_mode=OFF
,GTID 状态(即 的值 gtid_executed
)是持久的。这样可以确保始终保留服务器已应用的 GTID 集,而不管 gtid_mode
.
无论当前选择什么,与 GTID 相关的字段都会显示正确的信息 gtid_mode
。gtid_executed
这意味着显示 GTID 集的字段, 例如 Performance Schema 表中 的 gtid_purged
, 以及(或 MySQL 8.0.22 之前 的)的 GTID 相关结果,现在在没有 GTID 时返回空字符串。显示单个 GTID 的字段(例如 性能模式 表中的字段)现在会在未使用 GTID 事务时显示。 RECEIVED_TRANSACTION_SET
replication_connection_status
SHOW REPLICA STATUS
SHOW SLAVE STATUS
CURRENT_TRANSACTION
replication_applier_status_by_worker
ANONYMOUS
从源复制 using gtid_mode=ON
提供了使用 GTID 自动定位的能力,使用语句的配置 SOURCE_AUTO_POSITION
( CHANGE REPLICATION SOURCE TO
来自 MySQL 8.0.23)或语句的 MASTER_AUTO_POSITION
选项 CHANGE MASTER TO
(在 MySQL 8.0.23 之前)。正在使用的复制拓扑会影响是否可以启用自动定位,因为此功能依赖于 GTID,并且与匿名事务不兼容。强烈建议在启用自动定位之前确保拓扑中没有剩余的匿名事务,请参阅 第 17.1.4.2 节,“在线启用 GTID 事务”。
源和副本的有效组合 gtid_mode
和自动定位如下表所示,其中源gtid_mode
显示在水平位置,副本显示 gtid_mode
在垂直位置。每个条目的含义如下:
表 17.1 源和副本 gtid_mode 的有效组合
gtid_mode |
资源OFF |
资源OFF_PERMISSIVE |
资源ON_PERMISSIVE |
资源ON |
---|---|---|---|---|
复制品OFF |
是的 | 是的 | ñ | ñ |
复制品OFF_PERMISSIVE |
是的 | 是的 | 是的 | 是* |
复制品ON_PERMISSIVE |
是的 | 是的 | 是的 | 是* |
复制品ON |
ñ | ñ | 是的 | 是* |
当前选择的gtid_mode
也影响gtid_next
变量。下表显示了服务器在 和 的不同值下的gtid_mode
行为gtid_next
。每个条目的含义如下:
ANONYMOUS
:生成匿名交易。Error
: 产生错误,执行失败SET GTID_NEXT
。UUID:NUMBER
:生成具有指定 UUID:NUMBER 的 GTID。New GTID
:使用自动生成的数字生成 GTID。
表 17.2 gtid_mode 和 gtid_next 的有效组合
gtid_next 自动的二进制登录 |
gtid_next 自动的二进制注销 |
gtid_next 匿名的 |
gtid_next UUID:号码 |
|
---|---|---|---|---|
gtid_mode OFF |
匿名的 | 匿名的 | 匿名的 | 错误 |
gtid_mode OFF_PERMISSIVE |
匿名的 | 匿名的 | 匿名的 | UUID:号码 |
gtid_mode ON_PERMISSIVE |
新的 GTID | 匿名的 | 匿名的 | UUID:号码 |
gtid_mode ON |
新的 GTID | 匿名的 | 错误 | UUID:号码 |
当二进制日志关闭并 gtid_next
设置为 时 AUTOMATIC
,则不会生成 GTID。这与以前版本的行为一致。