Mysql备份表时java.sql.SQLException: Statement violates GTID consistency: CREATE TABLE ... SELECT.错误处理

一、问题描述

因为业务需求,要对表做变更。
变更前需先将表做个备份,于是采用如下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”的方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值