怎样查看lock table的阻塞信息

一 问题描述

Lock tables 表名 write会阻塞select,那怎样查找是谁执行的Lock tables呢?

示例:

USE baidd;

LOCK TABLE t1 WRITE;

在另一个会话里执行select就被卡住了。

所以此时想查出是谁执行的lock tables,然后将其进程杀掉。

二 解决办法

Mysql 5.7是performance_schema.metadata_locks能实现这一功能。

我本地测试的mysql版本是5.7.31。

2.1 开启wait/lock/metadata/sql/mdl

UPDATE performance_schema.setup_instruments

SET enabled = 'YES'

WHERE name = 'wait/lock/metadata/sql/mdl';

该开启方式重启后会失效,所以还需要修改配置文件,使其永久生效。

修改/etc/my.cnf,在[mysqld]下方添加一行:

performance_schema_instrument = 'wait/lock/metadata/sql/mdl=ON'

2.2 通过查询performance_schema.metadata_locks查看阻塞情况

#模拟故障

在一个会话里执行:

USE baidd;

LOCK TABLE t1 WRITE;

在另一个会话里执行select就被卡住了。

 #查看阻塞情况

可以看到owner_thread_id为28的阻塞了29。

#查看阻塞方的进程id

MySQL [(none)]> SELECT PROCESSLIST_ID FROM performance_schema.threads WHERE THREAD_ID=28;

+----------------+

| PROCESSLIST_ID |

+----------------+

|              3 |

+----------------+

1 row in set (0.000 sec)

#杀掉阻塞方进程

MySQL [(none)]> kill 3;

select可以正常查询了:

Mariadb 10.3.18目前还不支持此方式,10.5.2版本才支持,可参考:

https://mariadb.com/kb/en/performance-schema-metadata_locks-table/

--本篇文章参考了

mysql - Show all current locks from get_lock - Stack Overflow

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值