为了能够安全地配置在线服务器的复制模式,了解复制的一些关键概念非常重要。本节解释了这些概念,是尝试修改在线服务器的复制模式之前的必读内容。
MySQL 中可用的复制模式依赖于不同的技术来识别记录的事务。复制使用的事务类型如下:
GTID 事务由 形式的全局事务标识符 (GTID) 标识
UUID:NUMBER
。日志中的每个 GTID 事务总是以Gtid_log_event
. 可以使用 GTID 或使用文件名和位置来解决 GTID 事务。匿名事务没有分配 GTID,MySQL 确保日志中的每个匿名事务都以
Anonymous_gtid_log_event
. 在以前的版本中,匿名交易之前没有任何特定事件。匿名交易只能使用文件名和位置来寻址。
使用 GTID 时,您可以利用自动定位和自动故障转移,以及
使用 Performance Schema 表使用WAIT_FOR_EXECUTED_GTID_SET()
、
session_track_gtids
监视复制的事务。启用 GTID 后,您不能使用
sql_slave_skip_counter
,而是使用空事务。
从运行以前版本的 MySQL 的源接收的中继日志中的事务可能根本没有任何特定事件,但在重放并记录在副本的二进制日志中之后,它们前面有一个
Anonymous_gtid_log_event
.
在线配置复制模式的能力意味着gtid_mode
和
enforce_gtid_consistency
变量现在都是动态的,并且可以由具有足以设置全局系统变量的权限的帐户从顶级语句进行设置。请参阅
第 5.1.8.1 节,“系统变量权限”。在以前的版本中,这两个变量只能在服务器启动时使用适当的选项进行配置,这意味着对复制模式的更改需要重新启动服务器。在所有版本
gtid_mode
中都可以设置为
ON
或OFF
,对应是否使用 GTID 来标识事务。什么时候gtid_mode=ON
无法复制匿名交易,并且
gtid_mode=OFF
只能复制匿名交易。从 MySQL 5.7.6 开始,该
gtid_mode
变量有两个附加状态,OFF_PERMISSIVE
和
ON_PERMISSIVE
. 那时
新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
.
作为 MySQL 5.7.6 引入的更改的一部分,与 GTID 相关的字段已被修改,以便它们显示正确的信息,而不管当前选择的是什么
gtid_mode
。gtid_executed
这意味着显示 GTID 集的字段,
例如
Performance Schema 表中的
gtid_purged
,
和 GTID 相关结果
,现在在不存在 GTID 时返回空字符串。显示单个 GTID 的字段(例如在 Performance Schema
表中)现在会在未使用 GTID 事务时显示。
RECEIVED_TRANSACTION_SET
replication_connection_status
SHOW SLAVE STATUS
CURRENT_TRANSACTION
replication_applier_status_by_worker
ANONYMOUS
从源复制使用
gtid_mode=ON
提供了使用自动定位的能力,使用CHANGE
MASTER TO MASTER_AUTO_POSITION = 1;
语句配置。使用的复制拓扑会影响是否可以启用自动定位,因为此功能依赖于 GTID,并且与匿名事务不兼容。如果启用自动定位并遇到匿名事务,则会生成错误。强烈建议在启用自动定位之前确保拓扑中没有剩余的匿名事务,请参阅
第 16.1.4.2 节,“在线启用 GTID 事务”。的有效组合gtid_mode
下表显示了源和副本上的自动定位,其中源的
gtid_mode
显示在水平方向上,副本的
gtid_mode
显示在垂直方向上:
表 16.1 源和副本 gtid_mode 的有效组合
资源 |
资源 |
资源 |
资源 |
|
---|---|---|---|---|
复制品 |
是 |
是 |
否 |
否 |
复制品 |
是 |
是 |
是 |
是* |
复制品 |
是 |
是 |
是 |
是* |
复制品 |
否 |
否 |
是 |
是* |
在上表中,条目是:
当前选择的gtid_mode
也会影响gtid_next
变量。gtid_mode
下表显示了服务器对于和的不同值的行为gtid_next
。
表 16.2 gtid_mode 和 gtid_next 的有效组合
自动的 二进制登录 |
自动的 二进制注销 |
匿名的 |
UUID:编号 |
|
---|---|---|---|---|
|
匿名的 |
匿名的 |
匿名的 | 错误 |
|
匿名的 |
匿名的 |
匿名的 |
UUID:编号 |
|
新GTID |
匿名的 |
匿名的 |
UUID:编号 |
|
新GTID |
匿名的 |
错误 |
UUID:编号 |
在上表中,条目是:
ANONYMOUS
:生成匿名交易。Error
: 产生错误,无法执行SET GTID_NEXT
。UUID:NUMBER
:生成具有指定 UUID:NUMBER 的 GTID。New GTID
:使用自动生成的编号生成 GTID。
当二进制日志关闭并
gtid_next
设置为 时
AUTOMATIC
,则不会生成 GTID。这与以前版本的行为一致。