답변:
하나씩 죽일 필요가 있습니다. MySQL에는 대규모 kill 명령이 없습니다. 예를 들어 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 자체에서 수행하십시오.
다음 명령 실행
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")
또한 SHOW PROCESSLIST 명령을 MySQL을 통해 구문 분석하는 방법을 검색하고 셸에서 한 줄로 끝났습니다.
mysqladmin processlist -u <USERNAME> -p<PASSWORD> | \
awk '$2 ~ /^[0-9]/ {print "KILL "$2";"}' | \
mysql -u <USERNAME> -p<PASSWORD>
awk 명령 전에 grep 을 실행 하여 특정 데이터베이스 이름을 필터링 할 수 있습니다 .
아니면 ... 쉘에서 ...
service mysql restart
그래, 나도 나도 게으르지 만 편리 할 수도있어.
이보다 간단하지 않습니다. mysql 프롬프트에서 실행하십시오.
kill USER username;
제공된 사용자 이름으로 모든 프로세스를 종료합니다. 대부분의 사람들이 모든 용도로 동일한 사용자를 사용하기 때문에 작동합니다!
mysql에 대해 확실하지 않은 MariaDB에서 이것을 테스트했습니다.
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 전용 기능 일 것입니다.
다음은 커서를 사용하여 현재 사용중인 프로세스를 제외하고 모든 프로세스를 하나씩 종료하는 간단한 저장 프로 시저를 만듭니다.
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 ;
SELECT
s 와 함께 실행하여 다음과 같이 전후 프로세스를 표시 할 수 있습니다 .
SELECT * FROM information_schema.processlist;
CALL kill_other_processes();
SELECT * FROM information_schema.processlist;
나는 최근에 이것을해야했고 이것을 생각 해냈다
-- 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;
이렇게하면 단일 명령으로 모든 쿼리를 파일에 저장하고 실행할 필요가 없습니다.
모든 선택 쿼리 제거
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에 로그인하십시오.
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)
이것은 나에게 (MySQL 서버 5.5) 모든 MySQL 프로세스를 죽이는 데 효과적이었습니다.
mysql -e "show full processlist;" -ss | awk '{print "KILL "$1";"}'| mysql
다음은 운영 체제에 의존하지 않고 실행할 수있는 솔루션입니다.
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 Workbench로 할 수 있습니다. 이것을 실행하십시오.
kill id;
예:
kill 13412
그것은 그것을 제거합니다.
#! /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;
파이썬 언어의 경우 다음과 같이 할 수 있습니다.
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()
질의 1 select concat ( 'KILL', id, ';') from information_schema.processlist where user = 'username'into outfile '/tmp/a.txt';
쿼리 2 소스 a.txt
이렇게하면 특정 사용자에 의해 show processlist의 모든 쿼리를 종료 할 수 있습니다.
sudo service mysqld restart