批量 kill mysql 中运行时间长的sql
kill语法
kill [connection | query] thread_id
每个与mysqld的连接都在一个独立的线程里运行,您可以使用show processlist语句查看哪些线程正在运行,并使用kill thread_id语句终止一个线程。
kill允许自选的connection或query修改符:
· kill connection与不含修改符的kill一样:它会终止与给定的thread_id有关的连接。
· kill query会终止连接当前正在执行的语句,但是会保持连接的原状。
如果您拥有process权限,则您可以查看所有线程。如果您拥有super权限,您可以终止所有线程和语句。否则,您只能查看和终止您自己的线程和语句。
您也可以使用mysqladmin processlist和mysqladmin kill命令来检查和终止线程。
注释:您不能同时使用kill和embedded mysql server库,因为内植的服务器只运行主机应用程序的线程。它不能创建任何自身的连接线程。
当您进行一个kill时,对线程设置一个特有的终止标记。在多数情况下,线程终止可能要花一些时间,这是因为终止标记只会在在特定的间隔被检查:
· 在select, order by和group by循环中,在读取一组行后检查标记。如果设置了终止标记,则该语句被放弃。
· 在alter table过程中,在每组行从原来的表中被读取前,检查终止标记。如果设置了终止标记,则语句被放弃,临时表被删除。
· 在update或delete运行期间,在每个组读取之后以及每个已更行或已删除的行之后,检查终止标记。如果终止标记被设置,则该语句被放弃。注意,如果您正在使用事务,则变更不会被 回滚。
· get_lock()会放弃和返回null。
· insert delayed线程会快速地刷新(插入)它在存储器中的所有的行,然后终止。
· 如果线程在表锁定管理程序中(状态:锁定),则表锁定被快速地放弃。
· 如果在写入调用中,线程正在等待空闲的磁盘空间,则写入被放弃,并伴随”disk full”错误消息。
· 警告:对myisam表终止一个repair table或optimize table操作会导致出现一个被损坏的没有用的表。对这样的表的任何读取或写入都会失败,直到您再次优化或修复它(不中断)。
1、通过information_schema.processlist表中的连接信息生成需要处理掉的mysql连接的语句临时文件,然后执行临时文件中生成的指令
mysql> select concat('kill ',id,';') from information_schema.processlist where user='root'; +------------------------+ | concat('kill ',id,';') +------------------------+ | kill 3101; | kill 2946; +------------------------+ 2 rows in set (0.00 sec) mysql>select concat('kill ',id,';') from information_schema.processlist where user='root' into outfile '/tmp/a.txt'; query ok, 2 rows affected (0.00 sec) mysql>source /tmp/a.txt; query ok, 0 rows affected (0.00 sec)
2、杀掉当前所有的mysql连接
mysqladmin -uroot -p processlist|awk -f "|" '{print $2}'|xargs -n 1 mysqladmin -uroot -p kill
杀掉指定用户运行的连接,这里为mike
mysqladmin -uroot -p processlist|awk -f "|" '{if($3 == "mike")print $2}'|xargs -n 1 mysqladmin -uroot -p kill
3、通过shel脚本实现
#杀掉锁定的mysql连接 for id in `mysqladmin processlist|grep -i locked|awk '{print $1}'` do mysqladmin kill ${id} done
4、通过maatkit工具集中提供的mk-kill命令进行
#杀掉超过60秒的sql
mk-kill -busy-time 60 -kill
#如果你想先不杀,先看看有哪些sql运行超过60秒
mk-kill -busy-time 60 -print
#如果你想杀掉,同时输出杀掉了哪些进程
mk-kill -busy-time 60 -print –kill
mk-kill更多用法可参考:
http://www.maatkit.org/doc/mk-kill.html
http://www.sbear.cn/archives/426
maatkit工具集的其它用法可参考:
http://code.google.com/p/maatkit/wiki/tableofcontents?tm=6
参考文档:
http://www.google.com
http://www.orczhou.com/index.php/2010/10/kill-mysql-connectio-in-batch/
http://www.mysqlperformanceblog.com/2009/05/21/mass-killing-of-mysql-connections/
上一篇: 谈“攀比” 博客分类: 杂谈 人生感悟
推荐阅读
-
批量 kill mysql 中运行时间长的sql
-
MySQL中批量删除指定前缀表的sql语句
-
探讨:MySQL中如何查询当前正在运行的SQL语句
-
批量 kill mysql 中运行时间长的sql
-
MySQL中批量删除指定前缀表的sql语句_MySQL
-
Mysql 8.0版本导出的sql文件在Mysql 5.5中运行出错
-
sql server-mysql中datatable往数据库中大批量写入数据,类似sqlbulkcopy的类
-
探讨:MySQL中如何查询当前正在运行的SQL语句_MySQL
-
探讨:MySQL中如何查询当前正在运行的SQL语句_MySQL
-
MySQL中批量删除指定前缀表的sql语句_MySQL