故障分析 | MySQL 迁移完不能快速导数据了

2023年 10月 18日 40.3k 0

作者:秦福朗,爱可生 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

相关文章

pt-kill工具的使用
pt-ioprofile工具包的使用
数据库管理-第216期 Oracle的高可用-01(20240703)
DBMS_REPAIR EXAMPLE SCRIPT WITH PARTITION
数据库事务的四大特性: ACID 
使用BBED修复损坏的SYSTEM文件头

发布评论