怎样查看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

猜你喜欢

转载自blog.csdn.net/yabignshi/article/details/121243776