MySQL元数据锁MDL导致无法操作数据库的解决方法

本文主要介绍元数据锁MDL导致无法操作数据库的解决方法以及如何避免元数据锁阻塞。

MetaData Lock主要为了保证元数据的一致性,用于处理不同线程操作同一数据对象的同步与互斥问题。MySQL 5.5版本开始,引入了MDL锁,MDL锁是表级别的锁,有些类型的MDL锁会导致读写操作都无法进行,导致SQL的阻塞。

操作步骤

  1. 连接MySQL实例。具体操作请参见实例连接方式介绍,通过内网和公网连接实例。
  2. 在SQL窗口执行如下SQL查看数据库所有线程状态。
    show full processlist

    image.png

  3. 查看State列是否出现大量Waiting for table metadata lock,即表示出现阻塞,在对应的Info列可以查看到对应表的操作,找到正在对该表进行操作的会话Id。
  4. 在SQL窗口执行如下命令解锁MDL锁。
    kill id

    image.png

如何避免元数据锁阻塞

MDL 锁一旦发生会对业务造成极大影响,因为后续所有对该表的访问都会被阻塞,造成连接积压。所以日常要尽量避免 MDL 锁阻塞的发生,下面给出几点优化建议可供参考:

  • 开启 metadata_locks 表记录 MDL 锁。
  • 设置参数 lock_wait_timeout 为较小值,使被阻塞端主动停止。
  • 规范使用事务,及时提交事务,避免使用大事务。
  • DDL 操作及备份操作放在业务低峰期执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值