作者:秦福朗,爱可生 DBA 团队成员,负责项目日常问题处理及公司平台问题排查。热爱互联网,会摄影、懂厨艺,不会厨艺的 DBA 不是好司机,didi~
爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
本文共 400 字,预计阅读需要 2 分钟。
1背景
某金融公司有套系统最近刚迁移完,从 5.6 迁移到 5.7.30,并且在迁移前未开启 GTID,迁移后开启了 GTID 相关功能。业务按照以往的方式使用 CREATE TABLE ... SELECT ...
导数据的时候出现报错:Error Code:1786 (HY000): Mysql Statement violates GTID consistency: CREATE TABLE ... SELECT
。
2问题原理
这个问题比较简单,原因就是迁移后的 MySQL5.7 使用了 GTID,开启了 enforce_gtid_consistency
参数(GTID 强一致性)。
为保证分布式事务的一致性,MySQL 使用 GTID 来唯一标识一个事务。在 GTID 模式下,DDL 和 DML 语句会自动产生不同的 GTID 来标识不同的事务操作。但是 CREATE TABLE ... SELECT ...
只生成了一个 GTID,将 DDL 和 DML 操作合并为一个事务执行,这在语句执行失败时,会造成主从数据不一致。开启 enforce_gtid_consistency
参数就是为了 GTID 事务的原子性。
官方文档也有对 CREATE TABLE ... SELECT ...
这一操作的说明:
3解决方案
为了安全,不建议关闭这个参数。
在 MySQL5.7 上可以用拆分成两句 SQL 的方式,解决这个问题,比如:
#先创建表
CREATE TABLE ... LIKE...
#再插入数据
INSERT INTO ... SELECT ...
虽然之前的单条 SQL 能简单快速的导数到另一张表,但为了安全可以适当麻烦一点。
4MySQL 8.0
好消息是从 MySQL8.0.21 开始,支持原子 DDL 的存储引擎允许使用 CREATE TABLE ... SELECT ...
语句了。
本文关键字:#MySQL# #GTID# #事务#
阅读推荐
技术分享 | MySQL 数据导入方案推荐
技术分享 | 一个案例总结 MongoDB 与 Redis 主从同步问题
技术分享 | MySQL 权限变更,何时生效?
故障分析 | MongoDB 索引操作导致 Crash
故障分析 | Redis 主从复制风暴
技术分享 | 如何避免 RC 隔离级别下的 INSERT 死锁
故障解析 | 主从数据不一致竟然不报错?
OceanBase 走进 vivo 深圳
10月21日,OceanBase 社区走进 vivo 在深圳站举办,邀请大家共享主题为《国产数据库在多场景的应用实践与探索》的技术实践交流活动 ,与大家共同探讨国产数据库在不同行业、不同企业、不同应用场景下的实践经验和发展前景。此外,我们还邀请了国内数据库领域的技术专家和企业代表,他们将分享国产数据库的研发现状、应用案例,将为大家带来一场关于数据库领域的思考盛宴,带给您无限的启发。
爱可生解决方案架构师-刘世红,将在闪电演讲环节为大家带来《ActionDB助力企业国产数据库的升级》。
诚挚邀请您来到活动现场,与同行伙伴们进行技术交流。点击原文链接报名。
关于 SQLE
SQLE 是一款面向数据库使用者和管理者,支持多场景审核,支持标准化上线流程,原生支持 MySQL 审核且数据库类型可扩展的 SQL 审核工具。目前支持各种数据库规则 700+。
SQLE 获取
🔗 Github https://github.com/actiontech/sqle
📚 文档 https://actiontech.github.io/sqle-docs/
💻 官网 https://opensource.actionsky.com/sqle/
👥 微信群 添加管理员微信 ActionOpenSource