Mysql 不同版本online DDL的处理策略

news/2024/11/29 11:51:37/

关于DDL的ONLINE和OFFLINE,通俗的讲:

  • ONLINE:在执行DDL时允许DML操作

  • OFFLINE:在执行DDL时不允许DML操作

在生产上的场景就是业务正在运行,DBA需要在表中添加新的字段同时不能影响该表的写操作就是ONLINE DDL。也就是说,所谓的ONLINE和OFFLINE更准确是针对 ALTER TABLE 语句。

在 MySQL 5.6 版本之后,引入了 ALGORITHM 参数来控制并发时 ALTER TABLE 语句的算法,官方不建议指定该参数的值,MySQL 自己会选择最优的算法。语法如下:

ALTER TABLE TABLE_NAME ADD COLUMN COLUMN_NAME COLUMN_TYPE ALGORITHM=[ COPY | INPLACE |INSTANT ];

MySQL DDL 在操作时会经历三个阶段:准备阶段、执行阶段、提交阶段,不同算法在不同阶段分别做了不同的处理。

下面介绍一下这三种算法的区别:

COPY算法:

会在 SERVER 层加锁,生成临时表,将原表的数据逐行 copy 到临时表中,此时会阻塞 DML 操作,因此 COPY 算法产生的时OFFLINE DDL。COPY 算法的三个阶段分别做了如下操作:

准备阶段:

  1. 对表的元数据加共享锁,从 *.frm 文件读取表的元数据,此时其它并发的 DDL 不能执行,DML可以执行。

  2. 共享锁升级为排他锁,此时 DDL 和 DML 都不能执行。

  3. 在 SERVER 层通过 CREATE TABLE … LIKE … 语句创建临时表,在存储引擎层也生成对应的 *.ibd 和 *.frm 文件。

执行阶段、提交阶段:

  1. 修改临时表元数据。

  2. copy 原表数据到临时表。

  3. 重命名临时表及文件。

  4. 删除原表及文件。

  5. 提交事务,释放锁。

INPLACE算法:

不会创建临时表,部分情况需要 IN-PLACE 的方式 rebild 表。会在准备阶段和提交阶段加元数据锁,执行阶段不会阻塞DML。INPLACE 算法的三个阶段分别做了如下操作:

准备阶段:

  1. 对表加元数据锁,从共享锁升级为排他锁,此时并发 DML 不能操作。

  2. 根据语句不同判断 rebuild 表或者 no-rebuild 表。如果是 no-rebuild 会在原表路径下创建 *.frm 和 *.ibd 的临时中转文件。no-rebuild 除创建二级索引外只创建 *.frm 文件;在创建二级索引时,不会生成 *.ibd 文件,但会在原 *.ibd 文件中进行修改,该操作会在参数 tmpdir 指定的路径下生成临时文件,用于存储索引排序结果,然后再合并到原 *.ibd 文件中。

  3. 如果是 rebuild 则会申请 row log 空间,用于存放 DDL 执行阶段并发执行的 DML 操作,若是 no-rebuild 则不会进行此操作。

执行阶段:

  1. 释放排他锁,保留元数据共享锁,此时并发 DML 可以执行。

  2. 扫描元表主键以及二级索引的所有数据页,生成 B+TREE 存储到临时文件中。

  3. 如果是 rebuild 则将所有对原表的 DML 操作记录在 row log 文件中。

提交阶段:

  1. 升级元数据锁从共享锁升级成排他锁,此时 DML 不能执行。

  2. 若是 rebuild 重做 row log 文件中的内容,no-rebuild 则无此操作。

  3. 重命名原表文件,将临时表名改为原表名,删除原表文件。

  4. 提交事务,完成变更。

INSTANT算法:

该算法是在 MySQL 8.0.12 版本的新特性,该算法在操作时只修改数据字典中的元数据,不会 copy 数据也不会 rebuild 表,不会加元数据排他锁,原表数据不受影响,不会阻塞 DML ,整个过程瞬间完成。只有在后期触发时才会操作原表。当前版本的 InnoDB 存储引擎支持的 INSTANT 算法的操作有:

  1. ADD COLUMN

  2. ALTER TABLE TABLE_NAME ADD/DROP INDEX INDEX_NAME(COLUMN)

  3. ALTER TABLE TABLE_NAME RENAME NEW_TABLE_NAME

  4. 设置/删除默认值

  5. 添加/删除虚拟列

补充:rebuild 是指在 SERVER 层使用 CREATE TABLE LIKE 创建表的行为,no-rebuild 表示不在 SERVER 层通过 CREATE TABLE LIKE 创建表,但是有可能在存储引擎层创建转储的 *.ibd 文件和 *.frm 文件。

【MySQL】Online DDL详解


http://www.ppmy.cn/news/857339.html

相关文章

maven install时报错 Cannot run program “java”

在 /usr/bin 查看有没有java的命令 没有则创建软连接: sudo ln -s /media/hygd/Data/jdk/linux/jdk/jdk/jdk1.8.0_131/bin/java java 路径需要换成自己jdk路径 附:linux配置java和maven和tomcat环境变量 /etc/profile增加 export MAVEN_HOME/media/hyg…

bio、nio、aio、io多路复用

BIO-同步阻塞IO NIO-同步非阻塞IO 不断的重复发起IO系统调用,这种不断的轮询,将会不断地询问内核,这将占用大量的 CPU 时间,系统资源利用率较低 IO多路复用模型-异步阻塞IO IO多路复用模型,就是通过一种新的系统调用&a…

家政小程序开发-H5+小程序

移动互联网的发展,微信小程序逐渐成为商家拓展线上业务的重要手段。家政服务作为日常生活中不可或缺的一部分,也开始尝试通过小程序来提高服务质量和效率。 下面是一篇关于家政小程序开发的H5小程序的文章,希望对您有所帮助。 家政服…

迪士尼地铁背后的指挥官——地铁控制中心OCC,NOCC系统

2020年,恰逢上海地铁11号线迪士尼地铁站运营5周年。由MediaComm美凯的轨道交通指挥调度管理解决方案建设的迪士尼地铁站,迎来了一次对用户的回访。在回访中,MediaComm美凯的技术人员与用户深入交流探讨,详细了解设备的运行状况与用…

“科幻感”十足,扎克伯格说它将颠覆人类社会

本文转载自硅星人。 “但凡人能想象之事,必有人能将其实现。” “我们前几天又投了一个Metaverse相关的公司,这个概念最近越来越火,感觉下一个风口要来了。”在华尔街投行工作的小伙伴告诉硅星人。 是的,近期无论是国内还是国外…

Python爬虫示例:爬取 13 个旅游城市,看看大家放假了都爱去哪玩

距上次假结束已经好多天过去了。。。依然还是没有假期,想出去好多地方玩啊。你们是不是也在期待着假期呀,不过夏天也热,下次的假期大概就是中秋国庆了,那会儿还算是比较凉爽。心血来潮,就想爬一下大家假期最爱去哪玩&a…

谷歌回归中国又一招:在深圳开设办事处,推出Cloud AutoML里程碑产品

▼ 点击上方蓝字 关注网易智能 聚焦AI,读懂下一个大时代! 谷歌在深圳开设办事处 据外媒报道,在宣布计划在中国北京开设首个AI中国中心一个月后,谷歌通过进入深圳再次进军中国市场。 根据TechCrunch获得的一封内部邮件,…

美通社企业新闻汇总 | 2019.3.4 | 万豪国际2019年新增30多家奢华酒店;迪士尼李宁合作推出复古运动装...

要闻 前程无忧:节后芯片、通讯行业人才需求看涨, 金融业走低猎聘发布《2019年中国5G人才需求大数据报告》万豪国际集团2019年全球计划新增30多家奢华酒店迪士尼和李宁合作推出“李宁复古运动米奇系列”服饰星巴克星怡杯樱花味拿铁限时首发《柳叶刀》刊登中国科学家新…