学习技术需要掌握
作用、原理、安装步骤、工具使用、模拟演示、注意细节、优点缺点
一、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 后面的停止逻辑的。