【基础】Mysql Online DDL相关知识
Mysql执行ddl这样是包含如下3种模式。
1、COPY模式 ,是指DDL时,会生成(临时)新表,Mysql Server层,将原表数据逐行拷贝到新表中,在此期间会阻塞DML
2、INPLACE,无需拷贝全表数据到新表,但可能还是需要IN-PLACE方式,innodb引擎层生成临时文件。
不考虑 INSTANT模式的情况下,online DDL一定是INPLACDE模式,但是INPLACE模式不一定是online DDL。
3、INSTANT,只需修改数据字典中的元数据,无需拷贝数据也无需重建整表,同样,也无需加排他MDL锁,原表数据也不受影响。
整个DDL过程几乎是瞬间完成的,也不会阻塞DML。这个新特性是8.0.12引入的.
Mysql Online DDB对照表。
操作 | Instant
8.0特性 |
In Place | Copy | 可并行DML | 只修改元数据 |
新增辅助索引 | 否 | 是 | 否 | 是 | 否 |
删除辅助索引 | 否 | 是 | 否 | 是 | 是 |
修改索引名 | 否 | 是 | 否 | 是 | 是 |
新增主键 | 否 | 是 | 是 | 是 | 否 |
删除主键 | 否 | 否 | 是 | 否 | 否 |
删除并同时新增主键 | 否 | 是 | 是 | 是 | 否 |
新增字段 | 是(追加式) | 是 | 否 | 是 | 否 |
删除字段 | 否 | 是 | 是 | 是 | 否 |
修改字段数据类型 | 否 | 否 | 是 | 否 | 否 |
扩展VARCHAR列长度 | 否 | 是 | 否 | 是 | 是 |
新增STORED虚拟列 | 否 | 否 | 是 | 否 | 否 |
新增VIRTUAL虚拟列 | 是 | 是 | 否 | 是 | 是 |
转换表字符集 | 否 | 否 | 是 | 否 | 否 |
opitmize table | 否 | 是 | 是 | 是 | 否 |
修改表名 | 是 | 是 | 否 | 是 | 是 |
下面是online DDL执行的步骤:
1. DDL 启动时拿 MDL(元数据) 写锁
2. 然后降级成 MDL 读锁
3. 真正做 DDL(此过程中时间最长,不影响dml操作,ddl称为online的原因)
4. 升级成 MDL 写锁
5. 释放 MDL 锁
特别说明:
OlineDDL有一点是需要特别留意的是确保之前没有正在执行的长事务或者大查询,否则会造成DDL之后全部的dml全被阻塞住;
对此也进行了实验,进行了验证;并且之前工作中,也遇到过多次。
利用其他的工具,比如Pt-osc、Gh-ost的场景下,也需要留意,因为他们也涉及到修改表名,也需要MDL锁。