加入收藏 | 设为首页 | 会员中心 | 我要投稿 西安站长网 (https://www.029zz.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

浅谈DDL技术解密

发布时间:2019-09-19 07:51:15 所属栏目:建站 来源:张松然
导读:副标题#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技术解密

(编辑:西安站长网)

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

热点阅读