MySQL中无法使用杀死掉线程的原因是什么

  介绍

这篇文章将为大家详细讲解有关MySQL中无法使用杀死掉线程的原因是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。


在实际操作杀命令的时候,有时候会发现连接并没有第一时间被消灭掉,仍旧在processlist里面能看的到,但是显示的命令为死亡,而不是常见的查询或者是执行等,例如:

mysql>, show  processlist;   + - - - + - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +   | |,Id  User  |, Host ,,,,,,,,,,,,,, |, db ,,,, |, Command  |, Time  |, State ,,,,,,, |, Info ,,,,,,,,,,,,,,,,,,,,,,,,,, |   + - - - + - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +   |,31,|,root  |, 192.168.1.10:50410  |, sbtest  |, Query ,, |,,,, 0, |, starting ,,,, |, show  processlist ,,,,,,,,,,,,,, |   |,32,|,root  |, 192.168.1.10:50412  |, sbtest  |, Query ,, |,,, 62, |, User  sleep ,, |, select 睡眠(3600),得到sbtest1  |   |,35,|,root  |, 192.168.1.10:51252  |, sbtest  |, Killed , |,,, 47岁,|,Sending  data  |, select 睡眠(100),得到sbtest1  |   |,36,|,root  |, 192.168.1.10:51304  |, sbtest  |, Query ,, |,,, 20, |, Sending  data  |, select 睡眠(3600),得到sbtest1  |   + - - - + - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +

原因分析

遇事不决先翻官方文档,这里摘取部分官方文档的内容:

当你使用杀,表杀死国旗设置线程。在大多数情况下,它可能需要一些时间死因为杀了国旗的线程检查> <李>

选择语句中进行顺序,集团的时候,如果服务器CPU资源比较紧张,那么读?获取一批数据的时间会变长,从而影响下一次“标记检测”的时间。

<李>

对大量数据进行DML操作的时候,杀死这一类SQL语句会触发事务回滚(InnoDB引擎),虽然语句被扼杀掉了,但是回滚操作也会非常久。

<李>

杀死改变操作时,如果服务器的负载比较高,那么操作一批数据的时间会变长,从而影响下一次“标记检测”的时间。

<李>

其实参考杀死的作用机制,做一个归纳性的描述的话,那么:任何阻塞/减慢SQL语句正常执行的行为,都会导致下一次“标记检测“推迟,无法发生,最终都会导致杀操作的失败。

模拟一下

这里借用一个参数innodb_thread_concurrency来模拟阻塞SQL语句正常执行的场景:

定义的最大线程数允许InnoDB的内部。的值为0(默认)被解释为无限的并发性(没有限制)。该变量用于性能调优> mysql>, show  variables  like  & # 39; % innodb_thread_concurrency % & # 39;;   + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +   |,Variable_name ,,,,,,,,,,,, |, Value  |   + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +   | |,innodb_thread_concurrency  1,,,, |   + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +   1,row  set 拷贝;(0.00,sec)

然后开两个数据库连接(会话1和会话2),分别执行<代码>从sbt选择睡眠(3600)。sbtest1 语句,然后在第三个连接上杀死掉会话2的查询:

Session  1:   mysql>, select 睡眠(3600),得到sbtest.sbtest1;      Session  2:   mysql>, select 睡眠(3600),得到sbtest.sbtest1;   ERROR  2013, (HY000):, Lost  connection 用MySQL  server  during 查询   mysql>      Session  3:   mysql>, show  processlist;   + - - - + - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +   | |,Id  User  |, Host ,,,,,,,,,,,,,, |, db ,, |, Command  |, Time  |, State ,,,,,,, |, Info ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, |   + - - - + - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +   |,44,|,root  |, 172.16.64.10:39290  |, NULL  |, Query ,, |,,, 17, |, User  sleep ,, |, select 睡眠(3600),得到sbtest.sbtest1  |   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

MySQL中无法使用杀死掉线程的原因是什么