关于DDL ONLINE

Share on:

MySQL各版本,对于DDL的处理方式是不同的,主要有三种

Copy Table方式: 这是InnoDB最早支持的方式。顾名思义,通过临时表拷贝的方式实现的。新建一个带有新结构的临时表,将原表数据全部拷贝到临时表,然后Rename,完成创建操作。这个方式过程中,原表是可读的,不可写。但是会消耗一倍的存储空间。

Inplace方式:这是原生MySQL 5.5,以及innodb_plugin中提供的方式。所谓Inplace,也就是在原表上直接进行,不会拷贝临时表。相对于Copy Table方式,这比较高效率。原表同样可读的,但是不可写。

Online方式:这是MySQL 5.6以上版本中提供的方式,也是今天我们重点说明的方式。无论是Copy Table方式,还是Inplace方式,原表只能允许读取,不可写。对应用有较大的限制,因此MySQL最新版本中,InnoDB支持了所谓的Online方式DDL。与以上两种方式相比,online方式支持DDL时不仅可以读,还可以写,对于dba来说,这是一个非常棒的改进。

考虑不同的DDL操作类别 https://dev.mysql.com/doc/refman/5.6/en/innodb-create-index-overview.html 从表看出,In-Place为No,DML一定是No,说明 ALGORITHM=COPY 一定会发生拷贝表,只读。但 ALGORITHM=INPLACEE 也要可能发生拷贝表,但可以并发DML:

In-Place 为Yes是优选项,说明该操作支持INPLACE Rebuilds Table 为No是优选项,因为为Yes需要重建表。大部分情况与In-Place是相反的 Allows Concurrent DML? 为Yes是优选项,说明ddl期间表依然可读写,可以指定 LOCK=NONE(如果操作允许的话mysql自动就是NONE) Allows Concurrent Query? 默认所有DDL操作期间都允许查询请求,放在这只是便于参考 Notes 会对前面几列Yes/No带 * 号的限制说明 参考 http://seanlook.com/2016/05/24/mysql-online-ddl-concept/ http://fivezh.github.io/2017/07/23/MySQL-InnoDB-online-DDL/