生产环境出现过多次mysql hang住,写操作的sql堵住的情况,这个时候使用kill来kill所有的连接,但是大部分时候连接kill 后处于freeing item状态,kill在这种场景下基本无效。
查看官方文档(以下大致翻译):(http://dev.mysql.com/doc/refman/5.5/en/kill.html)
kill执行后,一个线程特定的kill flag会被设置(THD::killed)。大多数情况下,线程消亡可能是需要花一点时间的,因为kill flag是以特定的间隔被检查的:
1、对于select,group by,order by语句,每读取完一块后检查kill flag。如果有kill flag,这个语句就会终止。
2、对于alter table,每次读取一块之前检查kill flag。如果有kill flag,这个语句就会终止,临时表也会被删除。
3、对于update,delete操作,每次读取完一块或每次更新/删除一行后 检查kill flag。
4、insert delayed操作,立即flush内存中已经插入的行,然后终止。
5、如果一个连接处于locked状态,table lock立即终止。
从文档上看,在mysql hang住的时候,使用kill似乎并不是最佳选择,因为mysql并不会立即kill掉这些session。下面试图从代码上理一下mysql kill的处理逻辑。(5.1.58,其它版本会有差异,不过大致的逻辑没啥变化,最起码5.1和5.5的官方文档对于kill的解释没怎么变化:))
... /* kills a thread and sends response SYNOPSIS sql_kill() thd Thread class id Thread id only_kill_query Should it kill the query or the connection */ void sql_kill(THD *thd, ulong id, bool only_kill_query) { uint error; if (!(error= kill_one_thread(thd, id, only_kill_query))) my_ok(thd); else my_error(error, MYF(0), id); } ... /** kill on thread. @param thd Thread class @param id Thread id @param only_kill_query Should it kill the query or the connection @note This is written such that we have a short lock on LOCK_thread_count */ uint kill_one_thread(THD *thd, ulong id, bool only_kill_query) { THD *tmp; ... if (tmp) { /* If we're SUPER, we can KILL anything, including system-threads. No further checks. KILLer: thd->security_ctx->user could in theory be NULL while we're still in "unauthenticated" state. This is a theoretical case (the code suggests this could happen, so we play it safe). KILLee: tmp->security_ctx->user will be NULL for system threads. We need to check so Jane Random User doesn't crash the server when trying to kill a) system threads or b) unauthenticated users' threads (Bug#43748). If user of both killer and killee are non-NULL, proceed with slayage if both are string-equal. */ if ((thd->security_ctx->master_access & SUPER_ACL) || thd->security_ctx->user_matches(tmp->security_ctx)) { tmp->awake(only_kill_query ? THD::KILL_QUERY : THD::KILL_CONNECTION); error=0; } ... void THD::awake(THD::killed_state state_to_set) { ... killed= state_to_set; ... close_active_vio(); ...
sql_parse.cc中sql_kill()调用kill_one_thread(), kill_one_thread()找到对应的threadid,调用awake(),awake()做了2件事:设置标签killed;关闭连接。至此,kill操作就返回了。
kill flag被检查的点:
update--- while (!(error=info.read_record(&info)) && !thd->killed) { delete--- while (!(error=info.read_record(&info)) && !thd->killed && ! thd->is_error())
每种操作都会在不同的策略确保kill操作的线程消亡掉。
从mysql kill处理的机制看,在mysql hang住的情况下,大量写操作被阻塞,使用kill并不能立即解决问题,如果想尽快让mysql恢复服务,最快的是主备切换,或直接重启mysql。
ps:一些链接
http://www.dbasquare.com/2012/05/15/why-do-threads-sometimes-stay-in-killed-state-in-mysql/
http://www.dbasquare.com/2012/04/04/how-to-selectively-kill-queries-in-mysql/
相关推荐
为什么不建议给MySQL设置Null值?《死磕MySQL系列 十八》.doc
如何向mysql中插入数据?
分别写出启动、连接、停止和卸载MySql服务(服务名为MySql)的语句?
MySQL C++ Driver Based on JDBC 4.0 Specification ?Installing MySQL Connector/C++ ?Runtime Dependencies ?IDE for Developing C++ Applications ?Create the City Table in the test Database for Code ...
主要给大家介绍了关于Linux修改MySQL配置不生效问题的解决方法,文中通过示例代码介绍的非常详细,对大家学习或者使用Linux系统具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
随着去 IOE 运动的如火如荼,MySQL 数据库已经深入 到传统行业,大有改变行业格局。而与此同时,MySQL 数据库规模成倍的增长, 如何快速定位问题,解决问题?如何规模化、自动化运维?如何进行优化,提高 MySQL ...
要从命令行界面使用mysqlkill,您必须 npm install mysqlkill -g 用法 mysqlkill -h <hostname> -u <username> [-p ] 选项 -h, --help output usage information -h, --host <host> host name -u, --user <user> ...
本文实例讲述了MySQL修改my.cnf配置不生效的解决方法。分享给大家供大家参考,具体如下: 一、问题: 修改了 my.cnf 配置文件后,却不生效,这是怎么回事? 二、原因: 我们注意到,这里只说了修改 my.cnf,并没有说...
mysql> SHOW VARIABLES LIKE "%version%"; + ————————-+——————————+ | Variable_name | Value | + ————————-+——————————+ | protocol_version | 10
springboot2.1.3 + mysql(mybatis) + mongodb maven项目
MySQL中文参考手册.chm 449kb <br/>0 译者序 1 MySQL的一般的信息 1.1 什么是MySQL? 1.2 关于本手册 1.2.1 本手册中使用的约定 1.3 MySQL的历史 1.4 MySQL的主要特征 1.5...
1 MySQL的一般的信息 1.1 什么是MySQL? 1.2 关于本手册 1.2.1 本手册中使用的约定 1.3 MySQL的历史 1.4 MySQL的主要特征 1.5 MySQL稳定性? 1.6 顺应2000年 1.7 SQL一般信息和教程...
再把 Mysql 重启,再 insert 一条记录,这条记录的 ID 是 18 还是 15 ? 2、Mysql 的技术特点是什么? 3、Heap 表是什么? 4、Mysql 服务器默认端口是什么? 5、与 Oracle 相比,Mysql 有什么优势? 6、如何区分 ...
### 如何安装和配置MySQL? ### MySQL中的常用命令有哪些? ### 什么是MySQL事务? ### 什么是索引? ### MySQL中的连接(JOIN)有哪些类型? ### 如何优化MySQL查询性能? ### 什么是主从复制? ### 什么是...
1是
o 1.1 什么是MySQL? o 1.2 关于本手册 + 1.2.1 本手册中使用的约定 o 1.3 MySQL的历史 o 1.4 MySQL的主要特征 o 1.5 MySQL稳定性? o 1.6 顺应2000年 o 1.7 SQL一般信息和教程 o 1.8 有用的MySQL相关链接 ...
MySQL提升课程 全面讲解MySQL架构设计 如何获得MySQL最优性能? 如何建立MySQL高可用集群? 如何搭建稳定高效的MySQL环境?
介绍了mysql触发器的一些概念及一些使用案例
mysql面试题有哪些?