加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

浅谈DDL技术解密

发布时间:2019-09-18 22:27:33 所属栏目:MySql教程 来源:张松然
导读:副标题#e# 首先,用过数据库的小伙伴们(本文以 MySQL InnoDB 为例)都知道,MySQL 不止有增删改数据操作(DML),还有改表结构的操作(DDL),当新增加字段等修改表结构时,就需要进行 DDL 操作。可是,如果对一个存储了上百万甚至上千上万的数据表进行 DDL 操作

Online DDL 实现过程主要包括三个阶段:Initialization 阶段, Execution 阶段,Commit Table Definition 阶段。我们看下官方给出的内容(MySQL 8.0):

浅谈DDL技术解密

(引自:https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-performance.html)

我们详细描述下这三个过程的过程:

(1) Initialization

  • 创建 frm 临时文件
  • 持有EXCLUSIVE_MDL锁,禁止读写
  • 根据 ALTER 操作,确定执行过程(COPY,Online-Rebuilds,Online-No-Rebuilds)
  • 更新数据字典的内存对象
  • 若是需要 Rebuilds,分配 row_log 对象记录增量
  • 若是需要 Rebuilds,新建 ibd 临时文件

(2) Execution(如果仅修改 MetaData,则无此部操作)

  • 降低EXCLUSIVE-MDL锁,允许读写(COPY 仅允许读)
  • 记录执行期间产生的 DML 操作到 row_log(仅 Rebuilds 需要)
  • 扫描老表的聚集索引中每一条记录 record
  • 遍历新表的聚集索引和二级索引,逐一处理
  • 根据 record 构造对应的索引项
  • 将构造的索引项插入 sort_buffer 块中
  • 将 sort_buffer 块插入新的索引
  • 将 row_log 中的记录应用到新临时表,应用到最后一个 Block

(3) Commit Table Definition

  • 升级到EXECLUSIVE-MDL锁,禁止读写
  • 重做 row_log 中最后一部分增量
  • 更新 InnoDB 的数据字典
  • 提交事务,写 InnoDB redo 日志
  • 修改统计信息
  • Rename 临时的 ibd 和 frm 文件
  • DDL 执行变更

我理解,Online DDL 中的 COPY 和 INPLACE 的区别在于有没有原地,COPY 会将数据从 InnoDB 存储层 copy 到 Server 层,而 INPLACE 不会;而 INPLACE 中的 Rebuilds 和 No-Rebuils 的区别在于,有没有重建表。

PT-Online-Schema-Change(PT-OSC)

全称 Percona Toolkit Online Schema Change,其中 Percona Toolkit 源自 Maatkit 和 Aspersa 工具,这两个工具是管理 MySQL 最有名的工具,但 Maatkit 已经不维护了,全部归并到 Percona Toolkit。Percona Toolkit 是一组高级的命令行工具,用来管理 MySQL 和系统任务。

PT-OSC(pt-online-schema-change)工具特点与优势是支持并发 DML 操作。

浅谈DDL技术解密

GitHub’s Online Schema Transformer(GH-OST)

GH-OST 是 GitHub 的在线表定义转换器,与 PT-OSC 的最大区别,在于 GH-OOST 的无触发器设计。

浅谈DDL技术解密

至此,我们对比下 Online DDL、PT-OSC 和 GH-OST 的优缺点:

浅谈DDL技术解密

(引自:吴夏《在线DDL原理、对比分析和实践》)

总结

传统的 DDL,多数的 ALTER TABLE 操作是通过创建一个满足需求的新表,之后拷贝数据到新表,在用新表替换老表,整个过程会加锁,不支持并发 DML。在 MySQL 5.5 版本中,以 InnoDB Plugin 方式,优化了新增和删除索引的操作,避免了这种数据 copy 的开销,出现了 FIC。在 MySQL 5.6 开始增强了对各种 ALTER TABLE 操作支持,避免数据 copy 的开销,同时允许在 DDL 进行中,并发执行 DML 操作。在 MySQL 5.7 实现了 ALTER TABLE RENAME INDEX 操作,即支持在线的索引重命名,这种特性的综合,即 ONLINE DDL。PT-OST 通过改造原生 DDL 的方式,实现不锁表的在线修改表结构。

【本文是51CTO专栏作者张开涛的原创文章,作者微信公众号:开涛的博客,id:kaitao-1234567】

戳这里,看该作者更多好文

【编辑推荐】

  1. 如何避免回表查询?什么是索引覆盖? | 1分钟MySQL优化系列
  2. 数据库软件架构,到底要设计些什么?
  3. 内存KV缓存/数据库,可以选择它? | 1分钟系列
  4. 亿级流量高并发下,缓存与数据库不一致,咋办?
  5. 理解MySQL锁和事务,看这篇如何?
【责任编辑:赵宁宁 TEL:(010)68476606】
点赞 0

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读