在设置在线服务器的复制模式之前,了解复制的一些关键概念非常重要。本节解释了这些概念,是尝试修改在线服务器的复制模式之前必读的内容。
MySQL 中可用的复制模式依赖于不同的技术来识别已记录的事务。复制使用的交易类型如下所示
一个 GTID 事务由一个全局事务标识符 (GTID) 标识,该标识符采用以下两种形式之一:
UUID:NUMBER
或UUID:TAG:NUMBER
。二进制日志中的每个 GTID 事务之前都带有Gtid_log_event
。GTID 事务可以通过其 GTID 或记录它的文件的名称以及它在该文件中的位置来寻址。匿名事务没有 GTID;MySQL 8.4 确保日志中的每个匿名事务之前都带有
Anonymous_gtid_log_event
。(在旧版本的 MySQL 中,匿名事务之前没有特定的事件。)匿名事务只能通过文件名和位置来寻址。
当使用 GTID 时,您可以利用 GTID 自动定位和自动故障转移,并使用 WAIT_FOR_EXECUTED_GTID_SET()
、session_track_gtids
和性能模式表来监控复制的事务(参见 第 29.12.11 节,“性能模式复制表”)。
来自运行先前版本的 MySQL 的源的中继日志中的事务可能没有特定的事件,但在重放并记录在副本的二进制日志中后,它之前带有 Anonymous_gtid_log_event
。
要在线更改复制模式,需要使用具有设置全局系统变量的足够权限的帐户来设置 gtid_mode
和 enforce_gtid_consistency
变量;参见 第 7.1.9.1 节,“系统变量权限”。gtid_mode
的允许值如下所示,按顺序排列,并带有其含义
OFF
: 只能复制匿名事务。OFF_PERMISSIVE
: 新事务是匿名的;复制的事务可以是 GTID 或匿名。ON_PERMISSIVE
: 新事务使用 GTID;复制的事务可以是 GTID 或匿名。ON
: 所有事务必须具有 GTID;匿名事务无法复制。
在同一个复制拓扑中,可以有使用匿名事务的服务器和使用 GTID 事务的服务器。例如,gtid_mode=ON
的源可以复制到 gtid_mode=ON_PERMISSIVE
的副本。
使用 gtid_mode=ON
从源服务器进行复制,提供了使用 GTID 自动定位的功能,可以使用 SOURCE_AUTO_POSITION
选项在 CHANGE REPLICATION SOURCE TO
语句中配置。正在使用的复制拓扑会影响是否可以启用自动定位,因为此功能依赖于 GTID,与匿名事务不兼容。强烈建议在启用自动定位之前确保拓扑中不存在任何匿名事务;请参阅 第 19.1.4.2 节,“在线启用 GTID 事务”。
下表显示了源和副本上 gtid_mode
和自动定位的有效组合。每个条目的含义如下:
表 19.1 源和副本 gtid_mode 的有效组合
源 |
源 |
源 |
源 |
|
---|---|---|---|---|
副本 |
Y |
Y |
N |
N |
副本 |
Y |
Y |
Y |
Y* |
副本 |
Y |
Y |
Y |
Y* |
副本 |
N |
N |
Y |
Y* |
gtid_mode
的当前值也会影响 gtid_next
。下表显示了服务器在 gtid_mode
和 gtid_next
的不同值组合下的行为。每个条目的含义如下:
ANONYMOUS
: 生成匿名事务。Error
: 生成错误,并且不执行SET GTID_NEXT
。UUID:NUMBER
: 使用指定的 UUID:NUMBER 生成 GTID。UUID:TAG:NUMBER
: 使用指定的 UUID:TAG:NUMBER 生成 GTID。New GTID
: 使用自动生成的数字生成 GTID。
表 19.2 gtid_mode 和 gtid_next 的有效组合
gtid_next = AUTOMATIC (二进制日志打开) |
gtid_next = AUTOMATIC (二进制日志关闭) |
gtid_next = AUTOMATIC:<TAG> |
gtid_next = ANONYMOUS |
gtid_next = <UUID>:<NUMBER> |
gtid_next = <UUID>:<TAG>:<NUMBER> |
|
---|---|---|---|---|---|---|
gtid_mode = OFF |
ANONYMOUS | ANONYMOUS | Error | ANONYMOUS | Error | Error |
gtid_mode = OFF_PERMISSIVE |
ANONYMOUS | ANONYMOUS | Error | ANONYMOUS | <UUID>:<NUMBER> | <UUID>:<TAG>:<NUMBER> |
gtid_mode = ON_PERMISSIVE |
New GTID | ANONYMOUS | New GTID | ANONYMOUS | <UUID>:<NUMBER> | <UUID>:<TAG>:<NUMBER> |
gtid_mode = ON |
New GTID | ANONYMOUS | New GTID | Error | <UUID>:<NUMBER> | <UUID>:<TAG>:<NUMBER> |
当二进制日志未启用且 gtid_next
为 AUTOMATIC
时,不会生成任何 GTID。