在5.6版本之后,对于部分alter table ,加入新的执行算法,在有业务(DML操作)时,可以“并行”进
行表结构修改。
copy :
(1) create like MDL S ——> DDL
(2) add col new MDL S —-> DDL
(3) MDL S—> MDL X DDL , DML
(4) insert select 10min
(5) del old ,renae new to old
(6) unlock
inplace ()
instant
ALTER TABLE时ALGORITHM可以指定的几种方式:
COPY :
是指DDL时,会生成(临时)新表,将原表数据逐行拷贝到新表中,在此期间会阻塞DML
INPLACE :
无需拷贝全表数据到新表,但可能还是需要IN-PLACE方式(原地,无需生成新的临时表)重建整表。这种情
况下,在DDL的初始准备和最后结束两个阶段时通常需要加排他MDL锁(metadata lock,元数据锁),除此
外,DDL期间不会阻塞DML
INSTANT :
只需修改数据字典中的元数据,无需拷贝数据也无需重建整表,同样,也无需加排他MDL锁,原表数据也不受
影响。整个DDL过程几乎是瞬间完成的,也不会阻塞DML。这个新特性是8.0.12引入的,再次感谢腾讯互娱
DBA团队的贡献
执行DDL操作时,ALGORITHM选项可以不指定,这时候MySQL按照INSTANT、INPLACE、COPY的顺序自动选
择合适的模式。也可以指定ALGORITHM=DEFAULT,也是同样的效果。如果指定了ALGORITHM选项,但不支
持的话,会直接报错。
当采用COPY模式时,这时表里任何的修改数据操作,DDL都会被阻塞。COPY模式下会生成临时新表,操作完
成后原表会被删除,新表被重命名为原表名。当DDL开始后,原表上仅能只读,其他的DML操作也都会被阻
塞。COPY过程中,唯一会阻塞只读的时机是在清理旧表结构和表定义缓存时。
https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-operations.html

online ddl 重点 inplace

5.6版本之后,才开始支持,不同于copy得主要点,他把ddl执行流程下推至引擎层去执行,
copy是在server层,开始到结束,一直持有dml锁
inplace 准备阶段 执行阶段 提交阶段
异步加锁过程,在准备阶段是共享锁,不允许DML 和部分DDL 如drop 执行阶段也是共享锁,这个阶段是online 阶段 提交阶段会在此把共享锁升级为排查锁,阻塞DML 和部分DDL drop那种

inplace 算法
rebuild ——引擎层生成转储文件,
norebuild —不生成

copy 算法
rebuild —-在server层做 create insert 执行这种语句进行转储。