online ddl

(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

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

(2)常见ddl操作

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

online ddl

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

online ddl

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

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

开启一个事务
online ddl

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

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

转载于:https://blog.51cto.com/1000682/2356596

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值