【发布时间】:2010-12-26 14:33:02
【问题描述】:
因为我在那里看到了很多进程,并且“时间”列显示了所有进程的大值。
【问题讨论】:
-
你也可以重启mysqld,例如
sudo service mysqld restart
因为我在那里看到了很多进程,并且“时间”列显示了所有进程的大值。
【问题讨论】:
sudo service mysqld restart
群杀操作节省时间。在 MySql 本身中执行:
运行这些命令
mysql> select concat('KILL ',id,';') from information_schema.processlist
where user='root' and time > 200 into outfile '/tmp/a.txt';
mysql> source /tmp/a.txt;
---------edit------------
如果您不想存储在文件中,请存储在variable
只需在命令提示符下运行
> out1=$(mysql -B test -uroot -proot --disable-column-names -e "select concat('KILL ',id,';') from information_schema.processlist where user='root' and time > 200;")
> out2= $(mysql -B test -uroot -proot --disable-column-names -e "$out1")
【讨论】:
你需要一一杀掉,MySQL没有海量杀戮命令。您可以使用任何语言编写脚本,例如在 PHP 中,您可以使用以下代码:
$result = mysql_query("SHOW FULL PROCESSLIST");
while ($row=mysql_fetch_array($result)) {
$process_id=$row["Id"];
if ($row["Time"] > 200 ) {
$sql="KILL $process_id";
mysql_query($sql);
}
}
【讨论】:
for i in {994..1145}; do mysql -uroot -p123456 -e "kill $i" ; done
我还搜索了如何通过 MySQL 解析命令 SHOW PROCESSLIST 并以 Shell 中的单行结束:
mysqladmin processlist -u <USERNAME> -p<PASSWORD> | \
awk '$2 ~ /^[0-9]/ {print "KILL "$2";"}' | \
mysql -u <USERNAME> -p<PASSWORD>
您可以在 awk 命令之前运行 grep 来过滤特定的数据库名称。
【讨论】:
仅适用于 mariaDB
没有比这更简单的了,在mysql提示符下执行即可。
kill USER username;
它将杀死提供的用户名下的所有进程。因为大多数人出于所有目的都使用同一个用户,所以它有效!
我在 MariaDB 上测试过,不确定 mysql。
【讨论】:
KILL [CONNECTION | QUERY] processlist_id。我在 MySQL 5.6.34 中尝试过您的查询,它被认为是语法错误。
mysql> kill user root; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'root' at line 1 可能你的答案是 MariaDB 特有的特性。
或者...在外壳中...
service mysql restart
是的,我知道,我很懒,但它也可以很方便。
【讨论】:
我最近需要这样做,我想出了这个
-- GROUP_CONCAT turns all the rows into 1
-- @q:= stores all the kill commands to a variable
select @q:=GROUP_CONCAT(CONCAT('KILL ',ID) SEPARATOR ';')
FROM information_schema.processlist
-- If you don't need it, you can remove the WHERE command altogether
WHERE user = 'user';
-- Creates statement and execute it
PREPARE stmt FROM @q;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
这样,您无需存储到文件并使用单个命令运行所有查询。
【讨论】:
下面将创建一个简单的存储过程,使用游标将所有进程一一杀死,当前正在使用的进程除外:
DROP PROCEDURE IF EXISTS kill_other_processes;
DELIMITER $$
CREATE PROCEDURE kill_other_processes()
BEGIN
DECLARE finished INT DEFAULT 0;
DECLARE proc_id INT;
DECLARE proc_id_cursor CURSOR FOR SELECT id FROM information_schema.processlist;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;
OPEN proc_id_cursor;
proc_id_cursor_loop: LOOP
FETCH proc_id_cursor INTO proc_id;
IF finished = 1 THEN
LEAVE proc_id_cursor_loop;
END IF;
IF proc_id <> CONNECTION_ID() THEN
KILL proc_id;
END IF;
END LOOP proc_id_cursor_loop;
CLOSE proc_id_cursor;
END$$
DELIMITER ;
可以用SELECTs运行,显示前后进程如下:
SELECT * FROM information_schema.processlist;
CALL kill_other_processes();
SELECT * FROM information_schema.processlist;
【讨论】:
如果您没有 information_schema:
mysql -e "show full processlist" | cut -f1 | sed -e 's/^/kill /' | sed -e 's/$/;/' ; > /tmp/kill.txt
mysql> . /tmp/kill.txt
【讨论】:
mysql < /tmp/kill.txt。而且我认为在大多数情况下你会发现你需要指定运行mysql命令的用户和密码,所以它会是mysql -u root -p < /tmp/kill.txt
杀死所有选择查询
select concat('KILL ',id,';')
from information_schema.processlist
where user='root'
and INFO like 'SELECT%' into outfile '/tmp/a.txt';
source /tmp/a.txt;
【讨论】:
这个片段对我有用(MySQL 服务器 5.5)杀死所有 MySQL 进程:
mysql -e "show full processlist;" -ss | awk '{print "KILL "$1";"}'| mysql
【讨论】:
我们可以通过 MySQL Workbench 来完成。只需执行此操作:
kill id;
例子:
kill 13412
这将删除它。
【讨论】:
我会结合 bash 和 mysql:
for i in $(mysql -Ne "select id from information_schema.processlist where user like 'foo%user' and time > 300;"); do
mysql -e "kill ${i}"
done
【讨论】:
这是一个您可以在不依赖操作系统的情况下执行的解决方案:
第 1 步:创建存储过程。
DROP PROCEDURE IF EXISTS kill_user_processes$$
CREATE PROCEDURE `kill_user_processes`(
IN user_to_kill VARCHAR(255)
)
READS SQL DATA
BEGIN
DECLARE name_val VARCHAR(255);
DECLARE no_more_rows BOOLEAN;
DECLARE loop_cntr INT DEFAULT 0;
DECLARE num_rows INT DEFAULT 0;
DECLARE friends_cur CURSOR FOR
SELECT CONCAT('KILL ',id,';') FROM information_schema.processlist WHERE USER=user_to_kill;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET no_more_rows = TRUE;
OPEN friends_cur;
SELECT FOUND_ROWS() INTO num_rows;
the_loop: LOOP
FETCH friends_cur
INTO name_val;
IF no_more_rows THEN
CLOSE friends_cur;
LEAVE the_loop;
END IF;
SET @s = name_val;
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SELECT name_val;
SET loop_cntr = loop_cntr + 1;
END LOOP the_loop;
SELECT num_rows, loop_cntr;
END $$
DELIMITER ;
第 2 步:调用存储过程,并为其提供您要杀死其进程的数据库用户的名称。如果您愿意,您可以重写存储过程以根据其他条件进行过滤。
致电kill_user_processes('devdba');
【讨论】:
mysqladmin pr -u 'USERNAME' -p'PASSWORD' | awk '$2~/^[0-9]+/{print $2}' | xargs -i mysqladmin -u 'USERNAME' -p'PASSWORD' kill {}
【讨论】:
以管理员身份登录Mysql:
mysql -uroot -ppassword;
然后运行命令:
mysql> show processlist;
你会得到类似下面的东西:
+----+-------------+--------------------+----------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-------------+--------------------+----------+---------+------+-------+------------------+
| 49 | application | 192.168.44.1:51718 | XXXXXXXX | Sleep | 183 | | NULL ||
| 55 | application | 192.168.44.1:51769 | XXXXXXXX | Sleep | 148 | | NULL |
| 56 | application | 192.168.44.1:51770 | XXXXXXXX | Sleep | 148 | | NULL |
| 57 | application | 192.168.44.1:51771 | XXXXXXXX | Sleep | 148 | | NULL |
| 58 | application | 192.168.44.1:51968 | XXXXXXXX | Sleep | 11 | | NULL |
| 59 | root | localhost | NULL | Query | 0 | NULL | show processlist |
+----+-------------+--------------------+----------+---------+------+-------+------------------+
您将看到不同连接的完整详细信息。现在您可以按如下方式终止休眠连接:
mysql> kill 52;
Query OK, 0 rows affected (0.00 sec)
【讨论】:
对于python语言,你可以这样做
import pymysql
connection = pymysql.connect(host='localhost',
user='root',
db='mysql',
cursorclass=pymysql.cursors.DictCursor)
with connection.cursor() as cursor:
cursor.execute('SHOW PROCESSLIST')
for item in cursor.fetchall():
if item.get('Time') > 200:
_id = item.get('Id')
print('kill %s' % item)
cursor.execute('kill %s', _id)
connection.close()
【讨论】:
一个简单的方法是重新启动 mysql 服务器。 在 windows 运行中打开“services.msc”,从列表中选择 Mysql。右键单击并停止服务。然后重新启动,所有进程都将被杀死,除了一个(默认保留连接)
【讨论】:
#! /bin/bash
if [ $# != "1" ];then
echo "Not enough arguments.";
echo "Usage: killQueryByDB.sh <db_name>";
exit;
fi;
DB=${1};
for i in `mysql -u <user> -h localhost ${DB} -p<password> -e "show processlist" | sed 's/\(^[0-9]*\).*/\1/'`; do
echo "Killing query ${i}";
mysql -u <user> -h localhost ${DB} -p<password> -e "kill query ${i}";
done;
【讨论】:
有时我有一些无法杀死的僵尸 mysql 进程(使用 MAMP Pro)。
首先获取所有mysql进程的列表:
ps -ax | grep mysql
接下来将它们中的每一个都杀死(将 processId 替换为上一个命令结果中的第一列):
kill -9 processId
【讨论】:
以下内容对我很有用:
echo "show processlist" | mysql | grep -v ^Id | awk '{print $1}' | xargs -i echo "KILL {}; | mysql"
【讨论】:
我使用命令flush tables 杀死了所有非活动连接,这实际上是大规模问题。
【讨论】:
如果正在运行的进程不是你的,Kill 不起作用。我合并了其中一些解决方案并对其进行了扩展以创建一个更简单的解决方案(至少对我而言)。
m=mysql -p $password -h $host -u$user #you can also inline it of course
for i in `$m -e "show processlist" | awk '/$anySearchString/ {print $1}'`; do $m -e "call mysql.rds_kill($i);"; done
【讨论】:
如果你使用的是 laravel,那么这是给你的:
$query = "SHOW FULL PROCESSLIST";
$results = DB::select(DB::raw($query));
foreach($results as $result){
if($result->Command == "Sleep"){
$sql="KILL ". $result->Id;
DB::select(DB::raw($sql));
}
}
当然,您应该在命名空间后使用 use Illuminate\Support\Facades\DB;。
【讨论】:
查询 1 select concat('KILL ',id,';') from information_schema.processlist where user='username' into outfile '/tmp/a.txt';
查询 2 源 a.txt
这将使您能够杀死特定用户在 show processlist 中的所有查询。
【讨论】: