一、问题描述
因为业务需求,要对表做变更。
变更前需先将表做个备份,于是采用如下SQL:
CREATE TABLE Test_bak AS SELECT * FROM Test;
结果报如下错误(截取部分内容):
java.sql.SQLException: Statement violates GTID consistency: CREATE TABLE … SELECT.
二、原因分析
这是因为正在使用 MySQL 的 GTID 模式(全局事务标识符),而该模式下 不允许使用 CREATE TABLE … SELECT 语句,因为它不是事务性安全的操作。
三、处理方法1
将原本的一条语句 拆分为两条:
-- 第一步:复制结构
CREATE TABLE Test_bak LIKE Test;
-- 第二步:复制数据
INSERT INTO Test_bak SELECT * FROM Test;
这两条语句都是 GTID 模式下允许的。
补充说明:
在开启了 GTID 的 MySQL 实例中(通常用于主从复制或分布式事务),为了保证每个事务都可以被唯一标识和复制,所有语句都必须是事务安全的。
CREATE TABLE … SELECT 是复合语句,不能被包装在一个事务中,因此被禁止。
四、处理方法2
如果你仍然需要使用这种复合语句,并且确定不使用 GTID 或可以临时关闭它,也可以考虑如下方式:
⚠️ 临时关闭 GTID 检查(不推荐生产环境使用):
SET SESSION enforce_gtid_consistency = OFF;
然后再执行 CREATE TABLE … SELECT 语句。
更推荐使用前述“先 LIKE,再 INSERT”的方式。


7240

被折叠的 条评论
为什么被折叠?



