一 解决Statement violates GTID consistency: CREATE TABLE ... SELECT
问题:
mysql在备份表时报错Statement violates GTID consistency: CREATE TABLE ... SELECT.
CREATE TABLE tmp_fix0219 AS
SELECT trade_no,ctime FROM charge_data_log
执行后,如下图:
原因:
这个错误是由于在启用 GTID 模式的情况下执行了 CREATE TABLE ... SELECT
语句导致的。
在 GTID 模式下,CREATE TABLE ... SELECT
语句会被视为两个独立的事务:
- 一个 DDL 事务,用于创建新表。
- 一个 DML 事务,用于将数据插入新表。
这两个事务必须在一个 GTID 事务中执行,才能保证数据一致性。
如果在 GTID 模式下执行了 CREATE TABLE ... SELECT
语句,MySQL 会将该语句拆分为两个独立的事务,并为每个事务分配一个 GTID。但是,由于这两个事务不是在一个 GTID 事务中执行的,因此会导致数据不一致。
解决:
把上面sql语句修改如下:
CREATE TABLE tmp_fix0219 LIKE charge_data_log;
INSERT INTO tmp_fix0219
SELECT * FROM `charge_data_log` ;
1创建表结构
2执行插入数据
关于 MySql GTID
GTID(全局事务标识符)是一种用于 MySQL 复制的新型事务标识机制。它可以确保在主从复制环境中,所有事务都以一致的顺序执行。开启 GTID 可以提高复制的可靠性和安全性,并简化复制的配置和管理。
MySQL 5.7 开启与关闭 GTID
开启 GTID
1,确保所有服务器的 MySQL 版本都不低于 5.7.6。
2,在所有服务器上编辑配置文件 my.cnf
,添加以下参数:
log-bin=mysql-bin
binlog_format=ROW
gtid_mode=ON
enforce_gtid_consistency=ON
3,重启所有服务器。
关闭 GTID
1,确保所有服务器都处于停止状态。
2,在所有服务器上编辑配置文件 my.cnf
,将 gtid_mode
参数修改为 OFF
:
gtid_mode=OFF
3,重启所有服务器。
查看GTID 状态
SELECT @@GLOBAL.gtid_mode;
注意事项
- 开启 GTID 之前,需要确保所有服务器的 MySQL 版本都不低于 5.7.6。
- 开启 GTID 之后,不能再使用基于 binlog 位置的复制。
- 关闭 GTID 之后,必须将所有服务器的
gtid_mode
参数修改为OFF
。