[聚合文章] MySQL--Online DDL

MySQL 2018-01-07 19 阅读
最近帮助客户订正SQL时注意到alter的操作可能会锁表(MDL),所以也补一下online ddl的知识,避免不当的操作影响业务的运行。

Online DDL原理:
MySQL数据库操作中,DDL操作(比如CREATE,DROP,ALTER等)代价是非常高的,特别是在单表上千万的情况下,加个索引或改个列类型,就有可能堵塞整个表的读写。
1.1 Online DDL原理
在MySQL支持Online DDL之前,执行DDL主要有两种方式:copy方式和inplace方式,通过在ALTER语句的ALGORITHM参数指定。
ALGORITHM=INPLACE,可以避免重建表带来的IO和CPU消耗,保证DDL期间依然有良好的性能和并发。
ALGORITHM=COPY,需要拷贝原始表,所以不允许并发DML写操作,可读。这种copy方式的效率还是不如inplace ,因为前者需要记录undo和redo log,而且因为临时占用buffer pool引起短时间内性能受影响。
1.2 Online DDL锁定选项
Online DDL方式实质也包含了INPLACE和 COPY两种方式,对于不支持online的ddl操作采用copy方式,比如修改列类型,删除主键,修改字符集等,这些操作都会导致记录格式发生变化,无法通过简单的全量+增量的方式实现Online;对于inplace方式,MySQL内部以”是否修改记录格式”为基准也分为两类,一类需要重建表(重新组织记录),比如optimize table、添加索引、添加/删除列、修改列NULL/NOT NULL属性等;另外一类是只需要修改表的元数据,比如删除索引、修改列名不改变数据类型、修改列默认值、修改列自增值等。MySQL将这两类方式分别称为rebuild方式和no-rebuild方式。
此外还有LOCK选项控制是否锁表,根据不同的DDL操作类型有不同的表现:默认MySQL尽可能不去锁表,但是像修改主键这样的昂贵操作不得不选择锁表。
LOCK=NONE,即DDL期间允许并发读写涉及的表,比如为了保证ALTER TABLE时不影响用户注册或支付,可以明确指定,好处是如果不幸该alter语句不支持对该表的继续写入,则会提示失败,而不会直接发到库上执行。ALGORITHM=COPY默认LOCK级别。
LOCK=SHARED,即DDL期间表上的写操作会被阻塞,但不影响读取。
LOCK=DEFAULT,让MySQL自己去判断LOCK的模式,原则是MySQL尽可能不去锁表。
LOCK=EXCLUSIVE,即DDL期间该表不可用,堵塞任何读写请求。如果你想alter操作在最短的时间内完成,或者表短时间内不可用能接受,可以手动指定。
但是有一点需要说明,无论任何模式下,Online DDL开始之前都需要一个短时间排它锁(exclusive)来准备环境,所以alter命令发出后,会首先等待该表上的其它操作完成,在alter命令之后的请求会出现等待waiting meta data lock。同样在DDL结束之前,也要等待alter期间所有的事务完成,也会堵塞一小段时间。所以尽量在ALTER TABLE之前确保没有大事务和大的查询操作在执行,否则一样出现连环锁表。

Online DDL状态:
从上面的介绍可以看出,不是MySQL 5.6支持在线DDL就可以随心所欲的ALTER TABLE,锁不锁表要看情况:
提示:下表根据官方Summary of Online Status for DDL Operations整理挑选的常用操作。
In-Place 为Yes是优选项,说明该操作支持INPLACE。
Rebuilds Table?为No是优选项,因为为Yes需要重建表,大部分情况与In-Place是相反的。
Allows Concurrent DML?为Yes是优选项,说明ddl期间表依然可读写,可以指定LOCK=NONE(如果操作允许的话mysql自动就是NONE)。
Only Modifies Metadata?默认所有DDL操作期间都允许查询请求,放在这只是便于参考。
Notes会对前面几列Yes/No带 * 号的限制说明。

注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。