怎样查看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的阻塞信息的主要内容,如果未能解决你的问题,请参考以下文章

sql server中怎样查询引起死锁的sql语句

怎样在ensp中查看网络故障命令

Oracle中怎样查看所有的表,列,属性,主键等信息

怎样查看MySQL是否区分大小写

怎样查一个字符的unicode编码

oracle中怎样查询用户权限