解决MySQL8不能复制表1786 - Statement violates GTID consistency: CREATE TABLE ... SELECT.

解决MySQL8不能复制表1786 - Statement violates GTID consistency: CREATE TABLE … SELECT.

问题:

在复杂SQL查询结果,经常需要写入到表里保存,不能直接通过SQL语句创建表,与Oracle不同 。
如果SQL查询脚本结果复杂,则手工创建表的语句麻烦,测试解决方法如下。

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

错误原因:

网上查询,在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;

此方法需要调整系统参数。

方法二:

不需要调整系统参数。
看一下数据库版本号

mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.16    |
+-----------+
1 row in set (0.01 sec)

(1)创建临时表
可以用mysql查询语句创建临时表:

create temporary table tb_temp_evt_insert_test as select * from evt_insert_test ;

(2)通过临时表的创建表脚本

show create table tb_temp_evt_insert_test;

获得创建表脚本:

CREATE TEMPORARY TABLE `tb_temp_evt_insert_test` (
  `timeline` timestamp NULL DEFAULT NULL,
  `randstr` varchar(16) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

(3)修改为正常表的创建表脚本
删除关键字:TEMPORARY ,修改表名即可

CREATE  TABLE `tb_copy_evt_insert_test` (
  `timeline` timestamp NULL DEFAULT NULL,
  `randstr` varchar(16) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

并执行。

(4)将临时表的数据导入到正常表中

insert into tb_copy_evt_insert_test select * from tb_temp_evt_insert_test ;
commit;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值