MySQL InnoDB Online DDL学习

 目录


正文

MySQL Online DDL这个新特性是在MySQL5.6.7开始支持的,更早期版本的MySQL进行DDL对于DBA来说是非常痛苦的。现在主流版本都集中在5.6与5.7,为了更好的理解Online DDL的工作原理与机制,本文就对Online DDL的实现方式进行总结。

本文使用的MySQL版本为官方社区版 5.7.24

(root@localhost) [test] > select version(); +------------+ | version()  | +------------+ | 5.7.24-log | +------------+ 1 row in set (0.00 sec)

主要说明

Online DDL这个新特性解决了早期版本MySQL进行DDL操作同时带来锁表的问题,在DDL执行的过程当中依然可以保证读写状态,不影响数据库对外提供服务,大大提高了数据库和表维护的效率。

  • 早期实现方式(MySQL5.6.7之前版本)

早期版本MySQL执行DDL语句时主要通过以下方式进行:

COPY方式:
这是InnoDB最早期支持的方式,主要实现步骤:

  1. 创建与原表结构定义一致的临时表;
  2. 对原表加锁,不允许执行DML,但允许查询;
  3. 在临时表上执行DDL语句;
  4. 逐行拷贝原表数据到临时表;
  5. 原表与临时表进行RENAME操作,此时会升级原表上的锁,不允许读写,直至完成DDL操作;

INPLACE方式:
INPLACE方式也称为InnoDB fast index creation,是MySQL5.5及之后版本为了提高创建二级索引效率的方式,所以INPLACE方式仅限于二级索引的创建跟删除,关于fast index creation可以参考官方文档:InnoDB fast index creation,主要实现步骤:

  1. 创建临时的frm文件;
  2. 对原表加锁,不允许执行DML,但允许查询;
  3. 根据聚集索引的顺序,构造新的索引项,按照顺序插入新索引页;
  4. 升级原表上的锁,不允许读写操作;
  5. 进行RENAME操作,替换原表的frm文件,完成DDL操作。

相对于COPY方式,INPLACE方式在原表上进行,不会生成临时表,也不会拷贝原表数据,减少了很多系统I/O资源占用,但还是无法进行DML操作,也只适用于索引的创建与删除,并不适用于其他类型的DDL语句。

  • 当前实现方式(MySQL5.6.7及之后版本)

在MySQL5.6.7及之后版本中推出了新的特性:

Online DDL方式:
Online DDL特性是基于MySQL5.5的InnoDB fast index creation上改进增强的。Online DDL同样包含两种方式:

  1. COPY方式;
  2. INPLACE方式。

其中,某些DDL语句不支持Online DDL的就采用COPY方式,支持Online DDL的则采用INPLACE方式,因为Online DDL是对早期INPLACE方式的增加,所以INPLACE方式根据是否涉及到记录格式的修改又分为如下两种情形:

  1. Rebuilds Table;
  2. No-Rebuilds Table。

Rebuilds Table操作是因为DDL有涉及到行记录格格式的修改,如字段的增、删、类型修改等;
No-Rebuilds Table则不涉及行记录格式的修改,如索引删除、字段名修改等。

关键字:

50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信