32 kill不掉的语句

在mysql中有两个kill命令:一个是kill query+线程id,表示终止这个线程正在执行的语句;一个是kill connection+线程id,缺省connection值,表示断开这个线程的连接,当然如果这个线程有语句正在执行,也是要先停止正在执行的语句。

在大多数情况下,kill query/connection的命令是有效的。比如,执行一个查询的过程中,发现执行时间太久,要放弃查询,就可以用kill 命令,来终止这个查询。

还有一种情况,语句处于锁等待的时候,直接使用kill命令也是有效的

SESSION A

SESSION B

SESSION C

begin;

update t32 set c=c+1 where id=1;

update t32 set c=c+1 where id=1;(blocked)

Error 1317 :query execution was interrupted

Kill query thread_id_B;

收到kill以后,线程做了什么

Session b是直接终止掉线程,什么都不管就直接退出吗? 这是不行的。

当对一个表dml操作的时候,会在表上进行mdl读锁,所以,session b虽然处于blocked状态,但是还持有一个mdl读锁,如果线程被kill的时候,就直接终止,那之后这个mdl读锁就没有机会释放了。

所以,kill并不是马上就停止的意思,而是告诉执行线程,这条语句已经不需要继续执行了,可以开始”执行停止的逻辑了”

--其实,这根linux的kill命令类似,kill -N pid并不是让进程直接停止,而是给进程发一个信号,然后进程处理这个信号,进入终止逻辑,只是对mysql的kill命令来说,不需要传信号参数,只有停止这个命令。

当用户在执行kill query sessionB,mysql处理kill命令做了两件事:

--1 把session B的运行状态改成thd:kill_query(将变量killed赋值给the:kill_query)

--2 给session B的执行线程发一个信号

当kill执行的时候,kill不掉的时候

在show processlist中command的状态时Killed,在等待锁时,使用的函数这个等待状态可以被唤醒,但是,在执行的个别逻辑里面,如果不行,就进行sleep状态,可以在开一个session,执行kill线程的命令。

线程没有执行到判断线程状态的逻辑,由于io压力过大,读写io的函数一直返回,导致不能及时判断线程的状态。

另一种情况是,终止逻辑耗时较长,常见的情况

--1 超大事务执行期间被kill,回滚操作需要对事务期间生成的所有新数据版本做回收操作,耗时很长。

--2 大查询回滚,如果查询过程中生成了比较大的临时文件,加上此时文件系统压力大,删除临时文件可能需要等待io资源,到时耗时较长。

--3 ddl命令执行到最后阶段,如果被kill,需要删除中间过程中的临时文件,也可能受io资源影响耗时较久。

如果直接在客户端执行crtl+c 是不能直接终止线程的。

在执行ctrl+c的时候,是mysql客户端另外启动一个连接,然后发送一个kill query命令。

误解:如果库里面的表特别多,连接就会很慢

在一个库里面,如果表过多(6w多张表),会发现,每次用客户端连接就会卡在连接的界面,比较耗时

而如果db这个库里面的表比较少的话,连接起来就会很快

在客户端连接,每个客户端在和服务器建立连接的时候,需要做的事情就是tcp握手,用户校验,获取权限,这几个操作,显然跟数据库里面的表的数量无关。

但是,当使用默认连接的时候,mysql客户端会提供一个本地库名和表名的补全功能,为了实现此功能,客户端在连接成功,需要多做一些操作

--执行show databases

--切到db1,执行show tables

--把这两个命令的结果用于构建一个本地的哈希表

可以根据提示,在连接命令中加参数-A,可以关掉这个自动补全的功能,客户端就可以很快的返回。

Mysql客户端发送请求后,接收服务端返回结果的方式有两种

--1 一种是本地缓存,在本地开一片内存, 先把结果存起来,如果用api开发,对应就是mysql_store_result方法

--2 另一种是不缓存,读一个处理一个,对应api开发mysql_use_result方法

Mysql客户端默认采用第一种方式,如果加上-quick参数,就会使用第二种。

使用quick参数的效果

--跳过表名自动补全

--mysql_store_result需要申请本地内存来缓存查询结果,如果查询太大,会耗费较多的本地内存

--不会把执行命令记录到本地的历史命令文件

32 kill不掉的语句的更多相关文章

  1. 32 | 为什么还有kill不掉的语句?

    在 MySQL 中有两个 kill 命令:一个是 kill query + 线程 id,表示终止这个线程中正在执行的语句:一个是 kill connection + 线程 id,这里 connecti ...

  2. SQL Server会话KILL不掉,一直处于KILLED /ROLLBACK状态情形浅析[转]

    本文将为您描述SQL Server会话KILL不掉,一直处于KILLED /ROLLBACK状态情形浅析,教程操作方法: 今天遇到一个很奇怪的情况,发现一个会话异常,这个会话只是在执行一个简单的存储过 ...

  3. SQL Server会话KILL不掉,一直处于KILLED /ROLLBACK状态情形浅析

    今天遇到一个很奇怪的情况,发现一个会话异常,这个会话只是在执行一个简单的存储过程,里面使用了链接服务器(Linked Server)查询另外一台服务器数据(存储过程里面没有任何显性事务.UPDATE. ...

  4. Linux进程KILL不掉的原因

    做过Linux开发的人通常遇到过一个进程不能kill掉的情况,即使使用的是kill -9方式,而一般的教课书都只说kill -9能杀死任何进程,遇到这种情况时就会感觉到很矛盾,其它这也是正常的,通常有 ...

  5. 服务器中一个进程kill不掉,如何处理?

    问题描述: 我们在服务器中有时候kill一个进程,会碰到死活杀不死的情况,那么有可能这个进程成为了一个僵尸进程,zombie状态.这种情况是这个进程释放了资源,但是没有得到父进程的确认. 可以使用命令 ...

  6. 32个触发事件XSS语句的总结

    1.onmouseenter:当鼠标进入选区执行代码 <div style="background-color:red" onmouseenter="alert(b ...

  7. 一行CMD命令kill(杀)掉你的进程

    查看进程 pi@raspberry:~ $ ps -ef | grep python3 UID PID PPID C STIME TTY TIME CMD pi 4678 4666 0 11:57 p ...

  8. 一条语句kill 多条mysql语句

    If information_schema.processlist doesn’t exist on your version of MySQL, this works in a linux scri ...

  9. AJAX一些注释掉的语句

    var sysdept=JSON.parse(localStorage.getItem("loginSysUser")); for(var o in sysdept){ alert ...

随机推荐

  1. python 变量、列表、元组、字典

    python 变量.列表.元组.字典 1.python 变量赋值 2.ptython  列表 3.python 元组 4.python  字典 1.  Python变量赋值     1.1变量的命名规 ...

  2. noip2017简要题解。

    重新写了一下去年的题来看看自己到底是有多傻逼. 小凯的疑惑 打表. 时间复杂度 搞了一大坨题面,但是真正有用的信息只有几个: 判断他给你的复杂度是多少. 判断当前循环进不进的去. 判断当前循环产生的贡 ...

  3. TCP/IP基础总结性学习(5)

    与 HTTP 协作的 Web 服务器 一台 Web 服务器可搭建多个独立域名的 Web 网站,也可作为通信路径上的中转服务器提升传输效率. 一. 用单台虚拟主机实现多个域名 HTTP/1.1 规范允许 ...

  4. 【BZOJ3601】一个人的数论

    题目链接 题意简述 求小于 n 且与 n 互质的数的 k 次方之和. Sol 要求的东西: \[\sum_{i=1}^n i^k [gcd(i,n)=1]\] 枚举 gcd 上个莫比乌斯函数: \[\ ...

  5. unittest----常用属性详解(框架属性详解)

    很久没有写关于测试的随笔了,最近有空学习.整理一下关于unittest框架的知识. unittest单元测试框架,不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行. unittest ...

  6. jq元素左边距

    获取页面某一元素的绝对X,Y坐标,可以用offset():var X = $(‘#DivID’).offset().top;var Y = $(‘#DivID’).offset().left; 获取相 ...

  7. CSS画心形和蛋形

    一.心形 使用transform-origin属性实现设置不同的点为原点 1.改变元素基点transform-origin(transform-origin是变形原点,原点就是元素绕着旋转或变形的点) ...

  8. ORM详解,ORM Object relation mapping (对象关系映射)

  9. POJ 3046 Ant Counting ( 多重集组合数 && 经典DP )

    题意 : 有 n 种蚂蚁,第 i 种蚂蚁有ai个,一共有 A 个蚂蚁.不同类别的蚂蚁可以相互区分,但同种类别的蚂蚁不能相互区别.从这些蚂蚁中分别取出S,S+1...B个,一共有多少种取法. 分析 :  ...

  10. HDU 6206 Apple ( 高精度 && 计算几何 && 三点构圆求圆心半径 )

    题意 : 给出四个点,问你第四个点是否在前三个点构成的圆内,若在圆外输出"Accepted",否则输出"Rejected",题目保证前三个点不在一条直线上. 分 ...