MySQL Online DDL 技术深度解析

news2025/4/3 3:22:20

在MySQL数据库管理体系中,数据定义语言(DDL)和数据操作语言(DML)构成了数据库交互的基础。
DDL用于定义数据库对象,如数据库、表、列、索引等,相关命令包括CREATE、ALTER、DROP;DML则负责处理数据库中的数据,如插入、更新、删除,对应命令为INSERT、UPDATE、DELETE。
值得注意的是,DML操作可手动控制事务的开启、提交与回滚,而DDL操作是隐性提交,无法回滚,因此执行时需格外谨慎,且通常建议在业务低峰期进行。

一、MySQL DDL的演进——Online DDL的诞生

早期MySQL版本中,特别是在5.6之前,DDL操作尤其是ALTER语句,会严重阻塞表的读写操作。传统的DDL执行过程,需要新建临时表,对原表加写锁,拷贝数据,最后删除原表并对新表重命名。这一过程不仅耗时,还会占用大量额外存储空间,导致在数据拷贝期间,表的DML和DDL操作全部阻塞,极大影响数据库服务的可用性。

为解决这一问题,MySQL引入了Online DDL技术。它支持更多类型的ALTER TABLE操作,在执行DDL期间允许DML操作,避免了对数据库服务的中断。不过,并非所有DDL操作都支持Online操作。

二、Online DDL的运行机制

1. 执行流程

Online DDL通过建立临时文件,扫描原表主键数据页,生成B+树存储到临时文件。在这一过程中,所有对原表的操作会记录在日志文件(row log)中。临时文件生成后,日志文件中的操作会应用到临时文件,使其在逻辑数据上与原表相同,最后用临时文件替换原表数据文件。

2. 语法特性

使用ALTER TABLE语句时,可以指定ALGORITHM和LOCK参数。例如,“ALTER TABLE tab ADD COLUMN c varchar(50), ALGORITHM=INPLACE, LOCK=NONE;”。ALTER语句启动时会获取MDL写锁,在真正拷贝数据前退化为读锁,既保证了DDL执行期间DML操作的并发,又防止其他线程同时对表进行DDL操作。

3. 算法类型

  • Copy算法:MySQL 5.5及以下版本的默认算法。执行时会创建临时表,对原表加写锁,拷贝数据,完成后删除原表并重命名临时表。此过程锁表时间长,不支持并发DML写操作,适用于会导致行记录格式变化的操作,如删除主键、修改列类型等。
  • Inplace算法:MySQL 5.6开始引入并默认使用。该算法直接在原表上进行更改,无需生成临时表和数据拷贝。根据是否需要重建表,又分为rebuild和no - rebuild两类。前者适用于添加索引、添加/删除列等操作,通过缓存DDL期间的DML并在完成后应用到表上实现Online;后者适用于删除索引、修改列名等只需修改表元数据的操作。
  • Instant算法:MySQL 8.0.12开始引入并默认使用。目前仅支持增加列等少量DDL类型操作,其他操作仍默认使用inplace算法。

4. 锁策略

MySQL默认在执行DDL期间使用尽可能少的锁,也可通过LOCK子句控制锁级别。

  • DEFAULT:使用当前操作支持的粒度最小的锁策略。
  • NONE:不获取任何表锁,允许所有DML操作。
  • SHARED:对表添加共享锁(读锁),仅允许只读DML操作。
  • EXCLUSIVE:对表添加排他锁(写锁),禁止任何DML操作。

5. 执行阶段

Online DDL主要包括prepare、ddl执行和commit三个阶段:

  • Prepare阶段:初始化并计算DDL过程中的并发量,获取shared metadata lock保护表结构定义,创建临时frm文件,根据操作类型确定执行方式,更新数据字典内存对象,分配row_log记录增量(仅rebuild类型需要),生成临时ibd文件(仅rebuild类型需要),最后提交事务并释放锁。
  • DDL执行阶段:降低EXCLUSIVE - MDL锁级别,允许读写(copy算法不可写),扫描原表聚集索引记录,构造新索引项并插入,记录增量(仅rebuild类型需要),重放row_log操作到新索引上。
  • Commit阶段:将shared metadata lock升级为exclusive metadata lock,禁止DML,重做row_log最后部分增量,更新InnoDB数据字典表,提交事务,修改统计信息,重命名临时文件,完成变更。

三、Online DDL语法规范

Online DDL为加列、加索引等操作提供了更为灵活和高效的语法支持。在加列操作时,基本语法为“alter table 表名 add column 列名 数据类型,ALGORITHM 算法”。例如,“alter table t3 add column name1 varchar(16),ALGORITHM INPLACE/COPY/DEFAULT”。实际应用中,也可省略算法指定,系统会根据具体情况自动选择最优算法,如“alter table t3 add column name1 varchar(16)”。加索引操作的语法与之类似,“alter table 表名 add index 索引名(列名),ALGORITHM INPLACE”,同样支持省略算法指定。需注意,COPY算法本质上属于离线操作,默认情况下,系统会智能选择合适的算法。

四、Online DDL的COPY模式

1. COPY算法操作实例

以“alter table sbtest1 add column c varchar(122), ALGORITHM=COPY”操作为例,其执行过程可划分为准备、执行和提交三个阶段。

2. 三阶段执行流程

  • 准备阶段:首先对元数据添加共享锁(MDL-S),读取原表结构,此过程短暂且不阻塞DML,但禁止DDL操作。随后,共享锁升级为排他锁(MDL-X),此时DDL和DML操作均被阻塞。接着,server层执行类似“create table”的语句,创建与原表结构一致的临时表,引擎层也会生成相应的frm和ibd文件。
  • 执行阶段:对新创建的临时表进行表结构修改。完成修改后,server层将原表数据拷贝到临时表中,这一过程会阻塞DML操作,阻塞时长取决于数据拷贝速度。数据拷贝完成后,server层重命名临时表及文件,使其替代原表,并删除原表所有数据。
  • 提交阶段:执行commit操作,释放所有锁。

3. COPY算法的特点

从操作开始到结束,MDL-X锁一直存在,这会阻塞所有DDL和修改类DML操作,不过大多数情况下SELECT操作不受影响。由于整个DDL执行阶段都会阻塞业务,因此COPY算法不属于严格意义上的Online DDL。

五、Online DDL的INPLACE模式

1. 执行原理概述

INPLACE模式同样遵循准备、执行和提交三阶段模型。该模式于MySQL 5.6版本引入,将执行流程下推至引擎层,减少了对业务的影响。

2. 三阶段执行流程

  • 准备阶段:在进入准备阶段前,对元数据持有可升级的S锁(MDL-S锁),此阶段禁止DML和部分DDL操作,如drop操作。进入准备阶段后,MDL-S锁升级为X锁,系统会判断操作是否需要重建表。若需要重建表,会申请row log空间,用于记录Online DDL执行阶段对原表数据的DML操作,其空间大小由innodb_sort_buffer_size决定。若需重建表,引擎层会生成原表的转储文件(如ibd、frm文件);若无需重建表,引擎层仅生成frm文件,如加索引操作。
  • 执行阶段:执行阶段将MDL-X锁降级为S锁,此阶段不阻塞DML操作,因此被称为Online阶段。在该阶段,引擎层会将原表存储的数据读取到准备阶段创建的ibd文件中,通过分析数据页和内部结构,逐行取出原表数据记录进行处理,并将DDL表结构修改应用到新的ibd文件中。
  • 提交阶段:引擎层将row log中的操作应用到新的ibd文件中,直至最后一个操作,系统会自动截断,避免DML操作持续影响。此时,MDL-S锁再次升级为MDL-X锁,拒绝所有DML操作,将row log中剩余的数据应用完毕。随后删除原表,用新表替换原表,清理老文件,完成提交操作。

六、Online DDL常见问题剖析

1. Online DDL是否锁表?

从用户角度看,Online DDL在执行DDL期间不阻塞DML操作。但从管理员角度分析,准备阶段持有X锁,会阻塞DML;执行阶段降级为S锁,不阻塞DML;提交阶段升级为X锁,再次阻塞DML。

2. 支持INPLACE算法的DDL一定是Online的吗?

不一定。COPY和INPLACE算法的第一、三阶段对用户而言并非Online,只有第二阶段对用户来说是Online的。COPY算法执行的DDL肯定不是Online的,而INPLACE算法执行的DDL也不一定是Online的。

3. Online DDL是否需要额外磁盘空间?

对于引擎层需要创建ibd转储文件的操作,需要额外的存储空间。操作时长会受到数据量影响,但不会阻塞业务。

4. COPY方式和INPLACE方式有何区别?

COPY方式在server层进行操作,而INPLACE方式在engine层执行,这使得INPLACE方式能够更好地实现对业务影响的最小化。

5. 如何判断是rebuild table还是no rebuild table?

一方面,可以观察DDL执行时间,若执行阶段耗时较长,很可能是rebuild table方式。另一方面,可观察数据目录下是否生成#sql_xxx.ibd/frm文件,特别是ibd文件且其大小持续增大,也表明是rebuild table操作。

6. 如何判断是否为Online DDL?

执行DDL操作后,若返回“Query OK, 0 rows affected”,则大概率是Online DDL;若返回非0行影响,则可能是Offline DDL。

七、总结

加索引和加列等DDL操作会受到原表数据的影响。INPLACE模式之所以被称为原地操作,是因为其不涉及server层的表重建操作,而是将操作下推到引擎层执行。在INPLACE模式中,虽然无需通过server层的create语句重建表,但引擎层仍需生成ibd转储文件,因此这类操作仍需额外的存储空间。尽管Prepare阶段和Commit阶段会短暂加锁,但执行DDL阶段的Online特性,使得对原有业务的DML操作基本不会造成阻塞,不过可能会对系统负载和IO产生一定影响。如需了解更多Online DDL相关内容,可访问官方文档https://dev.mysql.com/doc/refman/5.6/en/innodb-online-ddl-operations.html 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2326927.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机视觉】YOLO语义分割

一、语义分割简介 1. 定义 语义分割(Semantic Segmentation)是计算机视觉中的一项任务,其目标是对图像中的每一个像素赋予一个类别标签。与目标检测只给出目标的边界框不同,语义分割能够在像素级别上区分不同类别,从…

【SpringBoot + MyBatis + MySQL + Thymeleaf 的使用】

目录: 一:创建项目二:修改目录三:添加配置四:创建数据表五:创建实体类六:创建数据接口七:编写xml文件八:单元测试九:编写服务层十:编写控制层十一…

在ensp进行OSPF+RIP+静态网络架构配置

一、实验目的 1.Ospf与RIP的双向引入路由消息 2.Ospf引入静态路由信息 二、实验要求 需求: 路由器可以互相ping通 实验设备: 路由器router7台 使用ensp搭建实验坏境,结构如图所示 三、实验内容 1.配置R1、R2、R3路由器使用Ospf动态路由…

Redis安全与配置问题——AOF文件损坏问题及解决方案

Java 中的 Redis AOF 文件损坏问题全面解析 一、AOF 文件损坏的本质与危害 1.1 AOF 持久化原理 Redis 的 AOF(Append-Only File) 通过记录所有写操作命令实现持久化。文件格式如下: *2\r\n$6\r\nSELECT\r\n$1\r\n0\r\n *3\r\n$3\r\nSET\r\…

3.第二阶段x64游戏实战-分析人物移动实现人物加速

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 上一个内容:2.第二阶段x64游戏实战-x64dbg的使用 想找人物的速度,就需要使用Ch…

Scala(三)

本节课学习了函数式编程,了解到它与Java、C函数式编程的区别;学习了函数的基础,了解到它的基本语法、函数和方法的定义、函数高级。。。学习到函数至简原则,高阶函数,匿名函数等。 函数的定义 函数基本语法 例子&…

什么是 Java 泛型

一、什么是 Java 泛型? 泛型(Generics) 是 Java 中一种强大的编程机制,允许在定义类、接口和方法时使用类型参数。通过泛型,可以将数据类型作为参数传递,从而实现代码的通用性和类型安全。 简单来说&…

Unity中根据文字数量自适应长宽的对话气泡框UI 会自动换行

使用Ugui制作一个可以根据文本数量自动调整宽度,并可以自动换行的文字UI 或者不要独立的Bg,那么一定要把bg的img设置成切片

【小也的Java之旅系列】02 分布式集群详解

文章目录 前言为什么叫小也 本系列适合什么样的人阅读正文单体优点缺点 CAP为什么CAP不可能全部满足?CAP 三选二 分布式事务分布式方案——SeataXA模式(强一致)AT模式(自动补偿,默认模式)TCC模式&#xff0…

Ubuntu里安装Jenkins

【方式1】:下载war包,直接运行,需提前搭建Java环境,要求11或17,不推荐,war包下载地址,将war包上传到服务器,直接使用命令启动 java -jar /data/jenkins/jenkins.war【方式2】&#…

C++包管理工具vcpkg的安装使用教程

前言 使用vcpkg可以更方便地安装各种库,省去配置的时间和配置失败的风险,类似python中的anaconda,懒人必备 参考 安装参考:https://bqcode.blog.csdn.net/article/details/135831901?fromshareblogdetail&sharetypeblogde…

微服务面试题:配置中心

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…

Qt msvc2017程序无法用enigma vitrual box打包,用winrar打包

我们通常打包Qt程序用Enigma virtual box。这样我们的程序就可以在别的电脑上也能运行,但是有时候,我们发现Enigma virtual box在打包的时候,对于msvc2017需要编译的程序中引用webengineview模块,打包时候发现不能运行。 我们如何…

微服务集成测试 -华为OD机试真题(A卷、JavaScript)

题目描述 现在有n个容器服务,服务的启动可能有一定的依赖性(有些服务启动没有依赖),其次,服务自身启动加载会消耗一些时间。 给你一个n n 的二维矩阵useTime,其中useTime[i][i]10表示服务i自身启动加载需…

Mac: 运行python读取CSV出现 permissionError

在MAC机器里,之前一直运行程序在某个指定的目录下读取excel和csv文件,没有出现错误,有一天突然出现错误:permissionError:[Errno 1] Operation not permitted, 具体错误信息如下: 经过调查得知&#xff0c…

UE5 学习笔记 FPS游戏制作30 显示击杀信息 水平框 UI模板(预制体)

文章目录 一制作单条死亡信息框水平框的使用创建一个水平框添加子元素调整子元素顺序子元素的布局插槽尺寸填充对齐 制作UI 根据队伍,设置文本的名字和颜色声明变量 将变量设置为构造参数根据队伍,设置文本的名字和颜色在构造事件中,获取玩家…

西门子TCP通讯过程中硬件连接突然断开

通信原理探秘又结合在工作中遇到的问题,关注到了通讯中的KeepAlive定时器的设置,所以做了如下实验。 硬件: 1513PLC TCP客户端 PC TCP服务器 前提条件:禁用PLC侧KeepAlive 程序: 测试流程: 打开PC端网络调试助手,设置为TCP服务器,打开链接; PC端打开WireShack软…

2025宁德时代测评Verify考什么?网申测评如何通过SHL笔试|附真题线上笔试考点、高分攻略、CATL新能源科技SHL测评宁德社招题目、面试攻略、求职建议

——职小豚 带你拆解新能源巨头招聘密码 一、宁德时代:新能源赛道「超级独角兽」 作为全球动力电池龙头,宁德时代(CATL)的江湖地位无需多言: 技术硬实力:麒麟电池、钠离子电池、无钴电池等黑科技加持&…

Spring Boot @RequestParam 解析参数时的常见问题及解决方案

1,遇到的问题:将后端接口写完后我想通过PostMan进行简单的测试一下,一不小心就遇到了这样的情况: org.springframework.web.bind.MissingServletRequestParameterException: Required Integer parameter contractId is not prese…

Firefox 浏览器同步一个账户和书签网址

Firefox 浏览器同步一个账户和书签网址 Firefox 支持跨设备接续浏览,可实现电脑、手机与平板无缝衔接。无论您在使用哪台设备上使用 Firefox,都能获取书签、浏览历史、保存的密码等信息。当然也能实现windows、ios、linux、android系统中安装firefox浏览…