查询长时间不返回问题

1.MDL锁堵塞

使用show processlist命令查看Waiting for table metadata lock的示意图。

当出现waiting for table metadata lock的时候,说明是MDL写锁堵塞了。

select blocking_pid from sys.schema_table_lock_waits获取blocking_pid。

通过查询sys.schema_table_lock_waits这张表,我们就可以直接找出造成阻塞的process id,把这个连接用kill 命令断开即可。

2.flush堵塞

假设有以下SQLselect * from information_schema.processlist where id=1001;

出现STATE是waiting for table flush,表示现在有一个线程正要对表t做flush操作。

MySQL里面对表做flush操作的用法,一般有以下两个:

  • flush tables t with read lock;
  • flush tables with read lock;

如果指定表table,代表关闭的知识表table,如果没有指定表table,则关闭MySQL里所有打开的表。

flush的速度很快,出现慢的情况是有一个flush tables命令被别的语句堵住了,然后它又堵住了select语句。

扫描二维码关注公众号,回复: 13466106 查看本文章

3.行锁堵塞

当其它事务上有写锁就会导致我们访问数据加读锁堵塞,此时需要找到写锁将它kill掉。

通过 select * from t sys.innodb_lock_waits where locked_table=test.table\G获取blocking_pid,执行kill pid,断开连接后会回滚正在执行的线程,释放目标行锁。

kill query pid这个命令表示停止pid号线程当前正在执行的语句,而这个方法其实是没有用的。因为占有行锁的是update语句,这个语句已经是之前执行完成了的,现在执行kill query,无法让这个事务去掉目标上的行锁。

猜你喜欢

转载自blog.csdn.net/MAKEJAVAMAN/article/details/118684280