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

猜你喜欢

转载自www.cnblogs.com/danhuangpai/p/11298417.html