批量清理mysql进程

批量kill掉无用的sql语句,避免影响拖垮数据库。

MariaDB [(none)]> show processlist;
+--------+------+-----------------+----------+---------+------+-------+------------------+----------+
| Id     | User | Host            | db       | Command | Time | State | Info             | Progress |
+--------+------+-----------------+----------+---------+------+-------+------------------+----------+
| 103258 | root | localhost:57884 | adminset | Sleep   |    2 |       | NULL             |    0.000 |
| 103259 | root | localhost       | NULL     | Query   |    0 | NULL  | show processlist |    0.000 |
+--------+------+-----------------+----------+---------+------+-------+------------------+----------+
2 rows in set (0.00 sec)

MariaDB [(none)]> show full processlist;
+--------+------+-----------------+----------+---------+------+-------+-----------------------+----------+
| Id     | User | Host            | db       | Command | Time | State | Info                  | Progress |
+--------+------+-----------------+----------+---------+------+-------+-----------------------+----------+
| 103258 | root | localhost:57884 | adminset | Sleep   |    3 |       | NULL                  |    0.000 |
| 103259 | root | localhost       | NULL     | Query   |    0 | NULL  | show full processlist |    0.000 |
+--------+------+-----------------+----------+---------+------+-------+-----------------------+----------+
2 rows in set (0.00 sec)

找到你符合你条件的线程id就可以kill了

mysql -uroot -S /var/lib/mysql/mysql.sock -sNe "select id from information_schema.processlist where COMMAND=‘Sleep‘ and TIME>60" | xargs -n 1 mysqladmin -uroot -S /var/lib/mysql/mysql.sock kill

或者生成kill 命令,再自己手动执行:

select concat(‘KILL ‘,id,‘;‘) from information_schema.processlist where COMMAND=‘Sleep‘ and TIME>60;

或者用工具mt-kill pt-kill

pt-kill --host=192.168.0.1 --user=root --password=mypwd --port=3306 --busy-time 60 --match-command="query|Execute" --victim all --interval 1 --kill --daemonize --pid=/tmp/ptkill.pid --print --log=/home/pt-kill.log

pt-kill --host=192.168.0.1 --user=root --password=mypwd --port=3306 --busy-time 60 --match-state="Locked|Sending data" --victim all --interval 1 --kill --daemonize --pid=/tmp/ptkill.pid --print --log=/home/pt-kill.log

pt-kill --host=192.168.0.1 --user=root --password=mypwd --port=3306 --busy-time 60 --match-info="SELECT|DELETE" --victim all --interval 1 --kill --daemonize --pid=/tmp/ptkill.pid --print --log=/home/pt-kill.log

还可以用如下脚本

#!/bin/bash
#批量kill mysql进程的时候条件要尽可能的严格,最好是过滤掉包括update和insert的进程
#kill掉test用户的mysql进程
#for i in `mysql -uroot -pmypwd -se "show processlist" | grep -v "show processlist" | awk ‘{if($2=="test") print $1}‘`
#kill掉来自172.16.13.177的主机的mysql进程
#for i in `mysql -uroot -pmypwd -se "show processlist" | grep -v "show processlist" | awk ‘{if($3 ~/^172.16.13.177:*/) print $1}‘`
#kill掉执行时间大于15秒的mysql进程
#for i in `mysql -uroot -pmypwd -se "show processlist" | grep -v "show processlist" | awk ‘{if($6 > 15) print $1}‘`
#kill掉执行所有的不包括update和insert关键词的mysql进程
#for i in `mysql -uroot -pmypwd -se "show full processlist" | grep -v "show full processlist"|grep -vi -E "update|insert"|awk ‘{print $1}‘`
do
#mysql -uroot -pmypwd -e "kill $i"
echo $i
done

原文地址:https://www.cnblogs.com/52py/p/12335501.html

时间: 2024-10-27 09:57:42

批量清理mysql进程的相关文章

批量 kill mysql 中运行时间长的sql

转自:思齐-批量 kill mysql 中运行时间长的sql 以下内容来自mysql手册: 13.5.5.3. KILL语法KILL [CONNECTION | QUERY] thread_id每个与mysqld的连接都在一个独立的线程里运行,您可以使用SHOW PROCESSLIST语句查看哪些线程正在运行,并使用KILL thread_id语句终止一个线程. KILL允许自选的CONNECTION或QUERY修改符: · KILL CONNECTION与不含修改符的KILL一样:它会终止与给

根据字段条件清理mysql数据库数据

根据字段条件清理mysql数据库数据 背景 线上某个数据库有1000个分库的DB,磁盘告警,每个库的大小都不是很大但是加起来就非常大了.手动根据时间字段来清理数据不太现实,于是决定写脚本来删除指定时间以前的数据. 脚本: #/bin/bash ##auth by qunyingliu ## files in xxx     HOST=$1 DBPORT=3306 USER="xxxx" PASSWORD="xxxx" DB_SKIP_CLEAN="mysq

linux 如何清理僵尸进程

今天在维护服务器的时候,发现有5个nova-novncproxy的僵尸进程. 26327 ?        S      0:05  \_ /usr/bin/python /usr/bin/nova-novncproxy --config-file=/etc/nova/nova.conf 4765 ?        Z      0:00      \_ [nova-novncproxy] <defunct> 4766 ?        Z      0:00      \_ [nova-no

生产环境批量修改mysql引擎

生产环境中如何批量修改MySQL引擎 一般来说这样的需求并不多见,但是偶尔也会有,在这里我们推荐使用sed对备份的内容进行引擎转换的方式,当然了,不要忘记修改my.cnf使之支持并能高效的使用对于的引用. 方法1 mysql命令语句修改 创建后引擎更改,5.0版本之后 alter table lvnian engine=innodb; alter table lvnian engine=MyISAM; 其中lvnian是表名 更改实例 ##############################

解决linux 系统中Mysql 进程占用CPU 300%故障

今日接到同事的电话,说微信公共帐号中的游戏无法登陆,用户不能玩了,麻烦尽快解决. 1.登陆IDC机房查看服务器流量图,流量正常,排除故障与流量无关. 2.登陆微信公共帐号中的游戏所在服务器发现系统互载过高,mysql进程CPU使用率超过300%. 为了快速解决问题直接重启mysql服务后,再查sysql进程CPU使用率依旧高居不下.故障还没有解决,继续寻找原因. 3.登陆mysql数据库,执行show processlist;查看当前正在执行的sql语句,发现几个表出现"sending data

MySQL5.7 在线调整Innodb_Buffer_Pool_size不用重启mysql进程

在之前的版本,调整Innodb_Buffer_Pool_size大小必须重启mysql进程才可以生效,如今在MySQL5.7里,可以直接动态设置,方便了很多. 这个功能应用的场景:一.机器增加内存,DBA粗心大意忘记调大Innodb_Buffer_Pool_size了二.工作交接,新来的DBA发现前任DBA设置的Innodb_Buffer_Pool_size不合理 需要注意的地方,在调整Buffer_Pool期间,用户的请求将会阻塞,直到调整完毕,所以请勿在白天调整,在凌晨3-4点低峰期调整.

批量修改mysql数据库表前缀。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Typ

批量建立MySQL表

今天遇到MySQL的分表问题,可以采用脚本方式循环建立新的表,也可以使用sql建立.下面以建立player_0到player_9的语句为例. delimiter // CREATE procedure create_table() BEGIN DECLARE `@i` int(11); DECLARE `@sqlstr` varchar(2560); SET `@i`=0; WHILE `@i` < 10 DO SET @sqlstr = CONCAT( "CREATE TABLE pla

批量删除mysql一个库所有数据表方法

批量删除mysql一个库所有数据表方法 删除表的命令 drop table 表名; 如果有100张表,手工执行100次,想想就崩溃. 下面提供一个使用information_schema库的方案来批量删除数据表:SELECT CONCAT('drop table ',table_name,';') FROM information_schema.`TABLES` WHERE table_schema='数据库名'; 如通过这条命令来得到drop table 表名;这样的语句,然后批量执行.mys