ERROR 1786 (HY000): Statement violates GTID consistency: CREATE TABLE ... SELECT.

本文详细解析了在MySQL 5.6及以上版本中遇到的GTID一致性错误,特别是使用CREATETABLE...SELECT语句时的问题。文章提供了两种解决方案,一种是调整GTID_MODE和ENFORCE_GTID_CONSISTENCY的设置,另一种是通过拆分SQL语句来避免错误。

创建表时报错,如下:

mysql> create table t_idb_big as select * from information_schema.columns;
ERROR 1786 (HY000): Statement violates GTID consistency: CREATE TABLE ... SELECT.
mysql>

错误原因:

这是因为在5.6及以上的版本内,开启了 enforce_gtid_consistency=true 功能导致的,MySQL官方解释说当启用 enforce_gtid_consistency 功能的时候,MySQL只允许能够保障事务安全,并且能够被日志记录的SQL语句被执行,像create table … select 和 create temporarytable语句,以及同时更新事务表和非事务表的SQL语句或事务都不允许执行。

解决方法:

方法一:
修改 :SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = off;
配置文件中 :ENFORCE_GTID_CONSISTENCY = off;
方法二(测试成功):
将 create table xxx as select 的方式拆分成两部分。
create table xxxx like data_mgr;
insert into xxxx select *from data_mgr;


1.当设置ENFORCE_GTID_CONSISTENCY = off时,错误消息说GTID_MODE = ON时需要ENFORCE_GTID_CONSISTENCY = ON,也就是需要设置GTID_MODE = OFF才能设置ENFORCE_GTID_CONSISTENCY = off
mysql> SET GLOBAL ENFORCE_GTID_CONSISTENCY = off;
ERROR 1779 (HY000): GTID_MODE = ON requires ENFORCE_GTID_CONSISTENCY = ON.
mysql> 

2.设置GTID_MODE = OFF
mysql> set global GTID_MODE = off;
ERROR 1788 (HY000): The value of @@GLOBAL.GTID_MODE can only be changed one step at a time: OFF <-> OFF_PERMISSIVE <-> ON_PERMISSIVE <-> ON. Also note that this value must be stepped up or down simultaneously on all servers. See the Manual for instructions.
mysql>
上面提示如果当前值为ON,要设置为OFF,则先设置为GTID_MODE=ON_PERMISSIVE,再设置GTID_MODE=OFF_PERMISSIVE,再设置GTID_MODE = off,如果将OFF设置为ON,则反过来设置即可。

继续设置:
mysql> set @@GLOBAL.GTID_MODE=ON_PERMISSIVE;
Query OK, 0 rows affected (0.01 sec)
mysql> set @@GLOBAL.GTID_MODE=OFF_PERMISSIVE;
ERROR 1766 (HY000): The system variable gtid_mode cannot be set when there is an ongoing transaction.

上面报错,当有正在进行的事务时,不能设置,所以就COMMIT一下:
mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> set @@GLOBAL.GTID_MODE=OFF_PERMISSIVE;
Query OK, 0 rows affected (0.01 sec)

mysql> 
mysql> set @@GLOBAL.GTID_MODE=OFF;
Query OK, 0 rows affected (0.01 sec)

mysql> 
mysql> 
mysql> show variables like 'GTID_MODE';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| gtid_mode     | OFF   |
+---------------+-------+
1 row in set (0.00 sec)

mysql> 
3.然后再设置SET GLOBAL ENFORCE_GTID_CONSISTENCY = off:
mysql> SET GLOBAL ENFORCE_GTID_CONSISTENCY = off;
Query OK, 0 rows affected (0.00 sec)

mysql>
 

2019.11.07

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值