一 简介: MDL锁
二 分类
1 MDL读锁 MDL读锁是相互兼容的 SHARED_READ
2 MDL 写锁 MDL写锁是互斥的 EXCLUSIVE
三 针对目标
1 目标 MDL锁是针对语句级别的,并非事务本身,是mysql_server层面的锁
2 目的 当事务本身执行的时候理论上是不能容忍表结构在中途发生改变的
四 MDL申请
0 select 语句 MDL_SHARED_READ
1 DML语句 MDL_SHARED_WRITE
2 DDL语句
1 inplace MDL_SHARED_UPGRADABLE,不会阻塞DML操作
2 copy MDL_EXCLUSIVE,会阻塞DML操作,针对select 会在rename时段卡主
3 其他全局性语句 涉及到的锁比较多 就不一一列出了
五 经典的元数据锁问题
问题 当我们执行DDL或者innobackup备份时,会出现waiting for table meta lock的问题,而且会导致后续session的等待,我们该如何处理呢
分析 执行上述操作需要申请MDL锁,就证明有操作在把持着MDL锁没有释放,大概会有几种
1 针对此表的慢查询操作(select),没有释放MDL锁
2 针对此表的未提交事物,可能是由于程序原因导致的
3 针对此表的 其他DDL操作
4 执行 flush table with read lock,常见innobackup
解决问题
1 通过show processlist 观察是否有 slow query,DDL,FTWRL操作,如果有进行处理
2 通过innodb_trx 观察是否有未提交事物,如果有进行处理
3 对于mysql5.7版本 可以通过 performance_schema.metadata_lock 进行观察,关键字 SHARED_READ
六 补充
1 MDL锁等待时间也是通过lock_wait_timeout 设置的
2 mysql5.7对MDL锁的相关特性进行了优化
3 读写事物语句,都是先申请 MDL_EXCLUSIVE,再降级成 READ WRITE锁,所以我上面没有标 注
4 由于队列设计,所以一旦出现MDL锁,一定要及时进行处理
mysql原理 ~ 细说 MDL锁
猜你喜欢
转载自www.cnblogs.com/danhuangpai/p/11298417.html
今日推荐
周排行