这篇文章将为大家详细讲解有关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 nullMySQL中无法使用杀死掉线程的原因是什么