为什么还有kill不掉的语句?

学习技术需要掌握

作用、原理、安装步骤、工具使用、模拟演示、注意细节、优点缺点

一、kill query 线程id 和 kill connection 线程id的区别

kill query 100; 命令是停止连接线程100当前正在运行的语句

kill connection 100; 这个命令可以省略connection, 表示先停止当前线程正在运行的语句,并断开这个线程

二、当我们执行kill命令后,数据库会怎么的操作?

① 执行kill命令后,正在运行的sql并不是马上停止,而是告诉执行线程这个sql不需要执行了,可以开始执行“停止逻辑”了

② 执行kill命令后,mysql对应线程进行了两件事

1、改变线程的运行状态,把线程改成THD::KILL_QUERY状态,意思就是被杀状态

2、给线程发送一个信号,如果线程正在处于等待,就让该线程退出等待,进入sql的停止逻辑。

sql的停止并不是说停止就立马停止的,而是mysql代码中有很多埋点,在sql执行过程中,会在埋点去判断这个线程的状态是否是THD::KILL_QUERY,如果是则走个停止逻辑,如果线程处于等待,则必须线程发送信号被唤醒才会走入到埋点。更加说明了kill命令以后,sql会走停止逻辑到停止逻辑走完是需要一个过程的,并不是立马就停止了。

所以:

我们执行kill命令后,感觉杀不掉是因为

mysql在执行后面的停止逻辑,可能停止逻辑比较花费的时间比较长。

还有一个情况就是,可能线程的没有执行到判断线程状态的逻辑,就一直卡在这里了

三、kill执行后,有哪些真实情况会很慢了

①  由于 IO 压力过大,读写 IO 的函数一直无法返回,导致不能及时判断线程的状态。

② 超大事务被kill后,回滚操作会对事务执行期间产生的大量的新数据版本进行回收,耗时比较长

③ 大查询回滚,如果查询中查收了大量的临时文件,加上此时mysql的文件系统压力大,删除临时文件可能等待的IO资源,耗时比较长

④ DDL命令执行到最后的阶段,如果被kill,需要删除中间产生的临时文件,可能也收IO资源的影响耗时比较长

这里有一个细节是:当我们在mysql的客户端执行ctrl+c时,是mysql客户端断开了与mysql server的连接,然后重新建立了一个连接并执行了kill 命令,所以并不是ctrl + c后,就万事大吉了。还有走kill 后面的停止逻辑的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值