mysql mdl 锁_mysql原理 ~ 细说 MDL锁

一 简介: 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锁,一定要及时进行处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值