MetaData Lock主要为了保证元数据的一致性,用于处理不同线程操作同一数据对象的同步与互斥问题。MySQL 5.5版本开始,引入了MDL锁,MDL锁是表级别的锁,有些类型的MDL锁会导致读写操作都无法进行,导致SQL的阻塞。
操作步骤
- 连接MySQL实例。具体操作请参见实例连接方式介绍,通过内网和公网连接实例。
- 在SQL窗口执行如下SQL查看数据库所有线程状态。
show full processlist
- 查看State列是否出现大量Waiting for table metadata lock,即表示出现阻塞,在对应的Info列可以查看到对应表的操作,找到正在对该表进行操作的会话Id。
- 在SQL窗口执行如下命令解锁MDL锁。
kill id
如何避免元数据锁阻塞
MDL 锁一旦发生会对业务造成极大影响,因为后续所有对该表的访问都会被阻塞,造成连接积压。所以日常要尽量避免 MDL 锁阻塞的发生,下面给出几点优化建议可供参考:
- 开启 metadata_locks 表记录 MDL 锁。
- 设置参数 lock_wait_timeout 为较小值,使被阻塞端主动停止。
- 规范使用事务,及时提交事务,避免使用大事务。
- DDL 操作及备份操作放在业务低峰期执行。