标签:文件的 lin optimize 查看进程 ges ima 操作 删除 事先
(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 的数据文件
说明: alter语句在启动的时候事先获取mdl写锁, 在拷贝数据的时候就退化成读锁, 读锁不阻塞增删改数据, 但是会阻塞其它线程的ddl语句(例如alter等), 由于mdl写锁的占用时间比较短就被认为是online
(2)常见ddl操作
注意: mysql5.6.42版本不支持命令optimize table命令;修改列类型, 例如给主键数据类型由int修改为bigint会导致其他的会话对这个表操作锁表;
(3)是否锁表验证:对一个表的50万数据, 修改这个表的列数据类型由int为bigint会导致锁表
(4)给表添加字段验证是否锁表: 不会锁表,但是要注意, 需要提前获取mdl写锁
(5)给表加mdl读锁, alter语句会阻塞, 那是因为alter语句需要获取mdl写锁, mdl写锁和mdl读锁互斥
开启一个事务
在另外一个连接删除这张表的字段
查看进程信息发现等待锁超时
标签:文件的 lin optimize 查看进程 ges ima 操作 删除 事先
原文地址:https://blog.51cto.com/1000682/2356596