online ddl

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 的数据文件

技术图片

说明: 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的主要内容,如果未能解决你的问题,请参考以下文章

mysql5.7 online ddl怎么查看进度

online ddl 工具之pt-online-schema-change封装

关于mysql 5.6 哪些操作可以进行online ddl 详解

pt-online-change-ddl(在线ddl)

mysql 5.6 online ddl

MySQL5.6 Online DDL