MySQL · 捉虫动态 · MySQL DDL BUG

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS PostgreSQL Serverless,0.5-4RCU 50GB 3个月
推荐场景:
对影评进行热评分析
云数据库 RDS SQL Server,基础系列 2核4GB
简介: 背景 MySQL保存了两份元数据,一份在server层,保存在FRM文件中,另外一份在引擎层,比如InnoDB的数据字典中,这样也就造成了DDL语句经常导致元数据不一致的情况,下面介绍两个近期出现的因为DDL产生的bug。 rename 外键引用的column BUG复现过程 CREATE

背景

MySQL保存了两份元数据,一份在server层,保存在FRM文件中,另外一份在引擎层,比如InnoDB的数据字典中,这样也就造成了DDL语句经常导致元数据不一致的情况,下面介绍两个近期出现的因为DDL产生的bug。

rename 外键引用的column

BUG复现过程

CREATE TABLE t1 (a INT NOT NULL,
                 b INT NOT NULL,
                 INDEX idx(a)) ENGINE=InnoDB;

CREATE TABLE t2 (a INT KEY,  b INT, INDEX ind(b),
                 FOREIGN KEY (b) REFERENCES t1(a)
                 ON DELETE CASCADE
                 ON UPDATE CASCADE) ENGINE=InnoDB;

ALTER TABLE t1 CHANGE a id INT;

在DEBUG版本下,MySQL实例是crash的,crash在 handler0alter.cc line 5643。

BUG原因分析

在做alter语句的时候,因为rename的column关联有foreign key,所以需要在数据字典中更改这个foreign key,但在数据字典缓存中还保留了一份foreign对象,代码只做了持久化的更改,在重新dict_load_foreigns()的时候,和缓存中的foreign key冲突,导致函数报错。

BUG修复方法

BUG修复也比较简单,在rename的过程中,先更改数据字典,然后调用dict_foreign_remove_from_cache函数清理内存中的对象,这样在重新dict_load_foreigns的时候,就一切正常了。

MySQL官方版本在5.6.23修复了这个问题。

alter 添加和删除索引导致不一致

BUG复现过程

CREATE TABLE t1(id INT, col1 INT, col2 INT, KEY(col1))ENGINE=InnoDB;
alter table t1 add key(col2), drop key col1;

复现此BUG的时候需要使用DEBUG_SYNC,在alter table的过程中,add key(col2)步骤成功,而在drop key的时候InnoDB报失败。
然后导致MySQL server层对表t1的定义和InnoDB层的定义不一致。

BUG原因分析
在drop key报引擎失败的时候,MySQL server层开始回滚整个DDL语句,server层这时回滚了FRM的定义,而InnoDB成功添加的key(col2)却没有回滚。

BUG修复方法
在alter的过程中,记录每一个阶段成功的调用,在语句结束的时候,如果遇到需要回滚的statement,需要同时回滚引擎层和server层。

因为MySQL保存了两份元数据,也造成在DDL变更的过程中,无法保证数据的一致性。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
23天前
|
SQL 存储 关系型数据库
菜鸟之路Day29一一MySQL之DDL
本文《菜鸟之路Day29——MySQL之DDL》由作者blue于2025年5月2日撰写,主要介绍了MySQL中的数据定义语言(DDL)。文章详细讲解了DDL在数据库和表操作中的应用,包括数据库的查询、创建、使用与删除,以及表的创建、修改与删除。同时,文章还深入探讨了字段约束(如主键、外键、非空等)、常见数据类型(数值、字符串、日期时间类型)及表结构的查询与调整方法。通过示例代码,读者可以更好地理解并实践MySQL中DDL的相关操作。
61 11
|
4月前
|
SQL 监控 关系型数据库
MySQL如何优雅的执行DDL
在MySQL中优雅地执行DDL操作需要综合考虑性能、锁定和数据一致性等因素。通过使用在线DDL工具、分批次执行、备份和监控等最佳实践,可以在保障系统稳定性的同时,顺利完成DDL操作。本文提供的实践和案例分析为安全高效地执行DDL操作提供了详细指导。
212 14
|
10月前
|
SQL 关系型数据库 MySQL
MySQL DDL(数据定义语言)深度解析
MySQL DDL(数据定义语言)深度解析
|
6月前
|
SQL 关系型数据库 MySQL
|
7月前
|
SQL 关系型数据库 MySQL
MySQL 更新1000万条数据和DDL执行时间分析
MySQL 更新1000万条数据和DDL执行时间分析
514 4
|
9月前
|
SQL 存储 关系型数据库
"MySQL增列必锁表?揭秘InnoDB在线DDL,让你的数据库操作飞一般,性能无忧!"
【8月更文挑战第11天】在数据库领域,MySQL凭借其稳定高效的表现深受开发者喜爱。对于是否会在给数据表添加列时锁表的问题,MySQL的行为受版本、存储引擎等因素影响。从5.6版起,InnoDB支持在线DDL,可在改动表结构时保持表的可访问性,避免长时间锁表。而MyISAM等则需锁表完成操作。例如,在使用InnoDB的表上运行`ALTER TABLE users ADD COLUMN email VARCHAR(255);`时,通常不会完全锁表。虽然在线DDL提高了灵活性,但复杂操作或大表变更仍可能暂时影响性能。因此,进行结构变更前应评估其影响并择机执行。
152 6
|
9月前
|
SQL 关系型数据库 MySQL
(十八)MySQL排查篇:该如何定位并解决线上突发的Bug与疑难杂症?
前面《MySQL优化篇》、《SQL优化篇》两章中,聊到了关于数据库性能优化的话题,而本文则再来聊一聊关于MySQL线上排查方面的话题。线上排查、性能优化等内容是面试过程中的“常客”,而对于线上遇到的“疑难杂症”,需要通过理性的思维去分析问题、排查问题、定位问题,最后再着手解决问题,同时,如果解决掉所遇到的问题或瓶颈后,也可以在能力范围之内尝试最优解以及适当考虑拓展性。
649 3
|
10月前
|
SQL 算法 关系型数据库
Mysql Online DDL
Mysql Online DDL
118 2
|
11月前
|
SQL 存储 关系型数据库
MySQL基础(一) 前置安装以及DDL详解
MySQL基础(一) 前置安装以及DDL详解
99 1
|
11月前
|
SQL 关系型数据库 MySQL
MySQL Online DDL原理解读
MySQL Online DDL原理解读
229 3

相关产品

  • 云数据库 RDS MySQL 版