解决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;