mysql进程修改_Mysql进程管理

mysql> show processlist;

+----+------+-----------+------+---------+------+-------+------------------+

| Id | User | Host      | db   | Command | Time | State | Info             |

+----+------+-----------+------+---------+------+-------+------------------+

|  7 | root | localhost | yy   | Sleep   |  154 |       | NULL             |

|  8 | root | localhost | NULL | Query   |    0 | NULL  | show processlist |

+----+------+-----------+------+---------+------+-------+------------------+

2 rows in set (0.00 sec)

mysql> kill 7

-> ;

mysql> show processlist;

+----+------+-----------+------+---------+------+-------+------------------+

| Id | User | Host      | db   | Command | Time | State | Info             |

+----+------+-----------+------+---------+------+-------+------------------+

|  8 | root | localhost | NULL | Query   |    0 | NULL  | show processlist |

+----+------+-----------+------+---------+------+-------+------------------+

1 row in set (0.00 sec)

-----

每个与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操作会导致出现一个被损坏的没有用的表。对这样的表的任何读取或写入都会失败,直到您再次优化或修复它(不中断)。

mysql 有选择地kill process

show processlist / show full processlist 可以看到当前的process信息,

如果想要kill某些process,只能复制它的Id(thread id),然后kill, 每次只能kill一个。

如果要kill掉所有运行时间超过10秒的语句,这样搞起来就太麻烦了。

今天介绍个简单的办法,主要是通过INFORMATION_SCHEMA数据库来实现。

其中的PROCESSLIST表记录了process的信息。

找出运行时间超过10秒的process的ID。

SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST

WHERE COMMAND = 'Query' AND TIME > 10;

这样似乎太莽撞了,有些进程不应该被kill的,比如负责replication的。。。

需要过滤一下:

SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST

WHERE COMMAND = 'Query' AND TIME > 10

AND ID != CONNECTION_ID()

AND USER != 'root'

AND COMMAND != 'Binlog Dump'

AND STATE NOT REGEXP '(slave|relay|event)'

你也可以根据实际情况加入自己的过滤条件。

然后比较悲剧的是 kill 只能接受一个id做为参数。

只好生成所有的kill语句了:

mysql> SELECT CONCAT('KILL ',ID,';')

FROM   INFORMATION_SCHEMA.PROCESSLIST

WHERE  USER = 'webs'

AND COMMAND = 'Query'

AND TIME > 10

INTO   OUTFILE '/tmp/kill_list.txt';

然后再导入:

注意下面这行语句不是以分号结尾的

mysql> \. /tmp/kill_list.txt

Query OK, 0 ROWS affected (0.00 sec)

虽然现在智能多了,但是这样搞一回也还是比较麻烦的。

可以试试看 Percona Toolkit里面的 pt-kill, 祝你们好运

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值