MySQL在线DDL特性提供了即时支持instant 、copy方式,还有原表in-place方式。有些过程中也允许并发DML。
语法:
|
为了避免在执行ALTER TABLE操作时表可读或不可写,可以在ALTER TABLE语句中指定一个子句,如果请求是并发级别且不可用,则操作立即停止。
常见问题:
- 支持 INPLACE 算法的 DDL 不一定是 Online
从概念上来说,INPLACE 和 Online 是两个不同维度的事情。COPY 和 INPLACE 指的是 DDL 内部的执行逻辑,可以简单的理解成:COPY 是在 Server 层的操作,INPLACE 是在 InnoDB 层的操作。从是否允许并发DML来看,有两个基本结论,COPY 算法执行的 DDL 肯定不是 Online 的,INPLACE 算法执行的 DDL 不一定是 Online 的。
- Online DDL有可能会锁表
MDL 锁是在 Server 层加的,表锁,行锁,GAP 锁在 InnoDB 层加的。所有的操作(不管是 DDL 还是 DML 还是查询语句)都需要先拿 Server 层的 MDL 锁,然后再去拿 InnoDB 层的某个需要的锁。一个 DDL 的基本过程是首先在开始进行 DDL 时,需要拿到对应表的 MDL X 锁,然后进行一系列的准备工作,然后将 MDL X 锁降级为 MDL S 锁,进行真正的 DDL 操作,最后再次将 MDL S 锁升级为 MDL X 锁,完成 DDL 操作,释放 MDL 锁,所以在真正执行 DDL 操作期间,确实是不会“锁表”的,但是如果在第一阶段拿 MDL X 锁时无法正常获取,那就可能真的会“锁表了”
标签:MDL,DDL,INPLACE,Online,操作,COPY From: https://www.cnblogs.com/complexlong/p/18439749