MySQL深入——22

kill不掉的语句

在MySQL当中有两个kill命令一个是kill query +线程id表示中止这个线程当中正在执行的语句,另外一个是 kill Connection+线程id表示断开这个连接。

在使用MySQL时,使用kill命令之后看show processlist显示的command列为killed,这是为什么呢??

收到kill命令之后线程会做以下的操作

前提:表正在执行Update操作,使表持有DML读锁。

对表进行kill之后,表会直接中止掉线程后什么都不管退出吗?对一个表进行增删改查操作时,会在表上加上DML读锁,当表被kill的时候就会直接终止了,那么之后这个DML锁就无法释放了,kill并不是直接停止,而是告诉线程不需要继续执行了。在执行kill query Thread_id_B之后,MySQL做了这几件事情

将表的运行状态改为THD::KILL_QUERY(将kill赋值为THD::KILL_QUERY),之后会给表发送一个信号,因为若是单纯的修改表的线程状态,表是并不知道的,会一直处于锁等待的状态,发送信号的目的就是让表退出等待,来处理这个THD::KILL_QUERY状态。

kill不掉的例子

即为inoodb_thread_concurrency不够用

在执行kill query C的时候不退出,执行Kill c的时候退出???

在行锁的时候,使用的pthread_cond_timewait函数,每十秒判断一次状态看是否可以进入InnoDB运行,一直循环判断,也就是说虽然状态被设定为了 THD::KILL_QUERY,但是一直在等待锁这个判断循环当中,没有判断线程的状态,故不会进入中止逻辑。

在执行kill Connection的时候,会将线程状态设置为KILL_CONNECTION 然后关掉线程的网络连接,所以可以看到session C出现了断开连接的提示。

Killed的显示是一个特别的逻辑,当一个线程的状态为KILL_CONNECTION,就会显示killed

总结:只有等待满足进入InnoDB之后,才会对线程的状态进入判断,在进入终止逻辑阶段。

这种例子是kill无效的第一种情况,还有可能造成这种情况的原因是IO压力过大,IO读函数一直无法返回,导致不能进行判断。

还有一种情况是:终止逻辑耗时长,这时候show processlist也会显示为killed。

比如:1.超大事务被kill,回滚操作需要对事务执行期间的所有阶段进行回收操作,耗时大

2.大查询回滚,查询过程中产生较大的文件,IO压力过大,无法删除,需要等待Io资源。

3.DLL命令执行到最后命令,kill时需要删除临时生成的文件,耗时长。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

下水道程序员

你的鼓励将是我奋斗的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值