码迷,mamicode.com
首页 > 其他好文 > 详细

online ddl

时间:2019-03-01 13:06:21      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:文件的   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读锁互斥

开启一个事务
技术图片

在另外一个连接删除这张表的字段
技术图片

查看进程信息发现等待锁超时
技术图片

online ddl

标签:文件的   lin   optimize   查看进程   ges   ima   操作   删除   事先   

原文地址:https://blog.51cto.com/1000682/2356596

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!