由于 GTID 是 MySQL 5.6 版本引入的新特性,因此在 MySQL 5.6 及后续版本中都会存在这个问题。DTS 仅支持 gtid_mode
的取值为 ON
和 OFF
,所以建议将 gtid_mode
设置为 ON
,否则 DTS 任务在创建进行预检查时都会报错。
GTID(Global Transaction Identifier,全局事务标识)是 MySQL 5.6 及后续版本中引入的一种用于标识和协调事务的机制。它为每个事务分配一个全局唯一的标识符,使得在基于 GTID 的复制环境中,管理和跟踪主从同步变得更加简单和可靠。
在预检查遇到该报错提示时,您需要将参数 gtid_mode
的取值修改为 ON
。
为确保系统的一致性并防止可能的错误,gtid_mode
参数提供了包括 OFF
、OFF_PERMISSIVE
、ON_PERMISSIVE
和 ON
取值:
OFF
:关闭 GTID 模式,即不使用 GTID 进行事务管理。
OFF_PERMISSIVE
:系统既接受没有 GTID 的事务,也接受带有 GTID 的事务,但不允许只有 GTID 的事务。这是一个过渡状态,允许从关闭 GTID 模式向开启 GTID 模式逐步过渡。
ON_PERMISSIVE
:系统生成 GTID 并将其附加到新的事务中,但仍然接受没有 GTID 的事务。这也是一个过渡状态,允许从关闭 GTID 模式向开启 GTID 模式逐步过渡。
ON
:完全启用 GTID 模式,只接受带有 GTID 的事务,拒绝没有 GTID 的事务。
需要注意的是,将 gtid_mode
参数从 OFF
修改为ON
,您需要按照顺序逐级修改。gtid_mode
参数的取值等级依次为 OFF
<->OFF_PERMISSIVE
<->ON_PERMISSIVE
<->ON
。具体操作如下所示:
登录源数据库实例。
修改 gtid_mode
的参数取值。
在主从复制结构两边都将 gtid_mode
参数取值由 OFF
修改为 OFF_PERMISSIVE
:
MySQL 5.7.6 之前的版本需要在 my.cnf
配置文件中修改并重启数据库才能生效,MySQL 5.7.6 及之后的版本通过全局命名修改,不需要重启数据库,但是需要重置所有业务连接。
SET GLOBAL gtid_mode = OFF_PERMISSIVE;
在主从复制结构两边都将 gtid_mode
参数取值由 OFF_PERMISSIVE
修改为 ON_PERMISSIVE
:
SET GLOBAL gtid_mode = ON_PERMISSIVE;
在各个实例节点上执行以下命令,检查匿名事务是否被消耗完:
SHOW VARIABLES LIKE '%ONGOING_ANONYMOUS_TRANSACTION_COUNT%';
预期执行结果如下所示:
说明
如果返回结果是 0,那么表示匿名事务已被消耗完。
mysql> SHOW VARIABLES LIKE '%ONGOING_ANONYMOUS_TRANSACTION_COUNT%'; +-------------------------------------+-------+ | Variable_name | Value | +-------------------------------------+-------+ | Ongoing_anonymous_transaction_count | 0 | +-------------------------------------+-------+ 1 row in set (0.00 sec)
在主从复制结构两边都将 gtid_mode
参数取值由 ON_PERMISSIVE
修改为 ON
:
SET GLOBAL gtid_mode = ON;
在 my.cnf
文件中添加以下内容,后重启数据库即初始值生效:
说明
my.cnf 配置文件的默认路径为 /etc/my.cnf
,现场以实际情况为准。
gtid_mode = on enforce_gtid_consistency = on
重新执行预检查任务。