初识MDL

我们知道mysql的默认隔离级别是RR, 在5.5之前这个隔离级别隔离的数据是有问题的, 存在状态为running的trx时, mysql期间再执行DDL, 就不能保证RR隔离级别的数据准确性

mysql为了解决这一问题, 在5.5之后出现了MDL, 这是一个隐式的锁, 事务执行完后会自动释放该锁, 当有DDL执行时, 该线程将会被阻塞, 直到所有的线程全部被执行完后再执行DDL操作

线上问题

线上的测试服务器启动起来后, 整个服务是假死的状态, 服务完全不能使用, 排查了服务器一切都是正常的, 但是mysql数据库发现很多线程被阻塞等待MDL, 看来是这个服务器启动不起来了又反复启动几次服务

image-20200601143222227.png

发现mysql存在线程正在等待该锁, 由此推断应该存在至少一个正在running的事务, 同时期应该也不会存在死锁或者被锁住的表的情况, 如下图所示

image-20200601142316459.png
解决方案
  1. 设置MDL等待超时时间, set session lock_wait_timeout=60
  2. 查看当前事务, 杀掉事务线程, 如果当前事务比较多业务比较复杂, 不建议该操作, 可能引起系统雪崩或者大范围业务回滚
  3. 选择mysql相对空闲的时间进行DDL操作, 建议DDL操作不能太频繁, 明显不正确的DDL就不要反复执行了

你可能感兴趣的:(初识MDL)