(0)版本支持

    mysql5.5及之前的版本是不支持online ddl的, 需要锁全表; 
    mysql5.6及之后的版本支持online ddl, 需要提前获取mdl写锁, 在copy数据的时候会降级成mdl读锁; 

(1)online ddl简单版工作原理

    1.建立一个临时文件, 扫描表A主键的所有数据页
    2.用数据页中表A的记录生成B+树, 存储到临时文件中
    3.生成临时文件的过程中, 对A的操作记录到日志文件中, 
    4.临时文件生成后, 将日志文件中的操作应用到临时文件文件, 得到一个逻辑数据上与表A 相同的数据文件
    5.用临时文件替换表A 的数据文件

online ddl_第1张图片

说明: alter语句在启动的时候事先获取mdl写锁, 在拷贝数据的时候就退化成读锁, 读锁不阻塞增删改数据, 但是会阻塞其它线程的ddl语句(例如alter等), 由于mdl写锁的占用时间比较短就被认为是online

(2)常见ddl操作

注意: mysql5.6.42版本不支持命令optimize table命令;修改列类型, 例如给主键数据类型由int修改为bigint会导致其他的会话对这个表操作锁表; 

online ddl_第2张图片

(3)是否锁表验证:对一个表的50万数据, 修改这个表的列数据类型由int为bigint会导致锁表
online ddl

online ddl

(4)给表添加字段验证是否锁表: 不会锁表,但是要注意, 需要提前获取mdl写锁
online ddl
online ddl

(5)给表加mdl读锁, alter语句会阻塞, 那是因为alter语句需要获取mdl写锁, mdl写锁和mdl读锁互斥

开启一个事务
online ddl_第3张图片

在另外一个连接删除这张表的字段
online ddl

查看进程信息发现等待锁超时
online ddl