怎样查看lock table的阻塞信息
Posted 雅冰石
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎样查看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
以上是关于怎样查看lock table的阻塞信息的主要内容,如果未能解决你的问题,请参考以下文章