1.背景
今天在开发环境验证好的备份sql脚本,就是用create table tnm as select * from tnm1(含结构和数据)。到了测试那里就报了错误:Mysql Statement violates GTID consistency: CREATE TABLE ... SELECT.
2.原因分析
查看了使用的数据库版本都是5.6以上,结合官方文档给出的解释:
MySQL5.6及以上的版本,开启了 enforce_gtid_consistency=true 功能导致的,MySQL官方解释说当启用 enforce_gtid_consistency 功能的时候,MySQL只允许能够保障事务安全,并且能够被日志记录的SQL语句被执行,像create table … select 和 create temporarytable语句,以及同时更新事务表和非事务表的SQL语句或事务都不允许执行。
对比了开发和测试库的参数,发现测试库的参数为on,开发的为off。
3.解决方法
3.1 在有超级用户权限的情况下将参数值改为off
在命令窗口或者配置文件my.cnf
SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = off;
3.2将原来的sql拆成两部分,先复制结构,再插入数据
create table a like b;
insert into a select * from b;