Câu trả lời:
Bạn cần phải giết từng cái một, MySQL không có bất kỳ lệnh tiêu diệt lớn nào. Bạn có thể viết nó bằng bất kỳ ngôn ngữ nào, ví dụ như trong PHP, bạn có thể sử dụng những thứ như:
$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
Hoạt động tiêu diệt hàng loạt tiết kiệm thời gian. Làm điều đó trong chính MySql:
Chạy các lệnh này
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------------
nếu bạn không muốn lưu trữ trong tệp, hãy lưu trữ trong một variable
Chỉ cần chạy trong dấu nhắc lệnh của bạn
> 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")
Tôi cũng đã tìm kiếm cách phân tích cú pháp thông qua MySQL bằng lệnh SHOW PROCESSLIST và kết thúc bằng một lớp lót trong Shell:
mysqladmin processlist -u <USERNAME> -p<PASSWORD> | \
awk '$2 ~ /^[0-9]/ {print "KILL "$2";"}' | \
mysql -u <USERNAME> -p<PASSWORD>
Bạn có thể chạy grep trước lệnh awk để lọc một tên cơ sở dữ liệu cụ thể.
Hoặc ... trong vỏ ...
service mysql restart
Vâng, tôi biết, tôi lười biếng, nhưng nó cũng có thể hữu ích.
Điều này không trở nên đơn giản hơn, Chỉ cần thực hiện điều này trong dấu nhắc mysql.
kill USER username;
Nó sẽ giết tất cả quá trình dưới tên người dùng được cung cấp. bởi vì hầu hết mọi người sử dụng cùng một người dùng cho mọi mục đích, nó hoạt động!
Tôi đã thử nghiệm điều này trên MariaDB không chắc chắn về mysql.
KILL [CONNECTION | QUERY] processlist_id
. Tôi đã thử truy vấn của bạn trong MySQL 5.6.34 và nó được coi là lỗi cú pháp.
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
Có thể câu trả lời của bạn là một tính năng dành riêng cho MariaDB.
Thao tác sau sẽ tạo một quy trình được lưu trữ đơn giản sử dụng con trỏ để giết từng quy trình một ngoại trừ quy trình hiện đang được sử dụng:
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 ;
Nó có thể được chạy với SELECT
s để hiển thị các quá trình trước và sau như sau:
SELECT * FROM information_schema.processlist;
CALL kill_other_processes();
SELECT * FROM information_schema.processlist;
Gần đây tôi cần phải làm điều này và tôi đã nghĩ ra điều này
-- 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;
Bằng cách đó, bạn không cần phải lưu trữ vào tệp và chạy tất cả các truy vấn bằng một lệnh duy nhất.
GIẾT TẤT CẢ CÁC CÂU HỎI ĐÃ CHỌN
select concat('KILL ',id,';')
from information_schema.processlist
where user='root'
and INFO like 'SELECT%' into outfile '/tmp/a.txt';
source /tmp/a.txt;
đăng nhập vào Mysql với tư cách là quản trị viên:
mysql -uroot -ppassword;
Và hơn lệnh chạy:
mysql> show processlist;
Bạn sẽ nhận được một cái gì đó như dưới đây:
+----+-------------+--------------------+----------+---------+------+-------+------------------+
| 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 |
+----+-------------+--------------------+----------+---------+------+-------+------------------+
Bạn sẽ thấy chi tiết đầy đủ của các kết nối khác nhau. Bây giờ bạn có thể hủy kết nối ngủ như sau:
mysql> kill 52;
Query OK, 0 rows affected (0.00 sec)
Đoạn mã này đã hoạt động đối với tôi (máy chủ MySQL 5.5) để giết tất cả các quy trình MySQL:
mysql -e "show full processlist;" -ss | awk '{print "KILL "$1";"}'| mysql
Đây là một giải pháp mà bạn có thể thực hiện mà không cần dựa vào hệ điều hành:
BƯỚC 1: Tạo một thủ tục được lưu trữ.
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 ;
BƯỚC 2: Gọi thủ tục đã lưu trữ, đặt cho nó tên của người dùng cơ sở dữ liệu có các quy trình bạn muốn giết. Bạn có thể viết lại quy trình được lưu trữ để lọc theo một số tiêu chí khác nếu bạn muốn.
GỌI kill_user_processes('devdba');
mysqladmin pr -u 'USERNAME' -p'PASSWORD' | awk '$2~/^[0-9]+/{print $2}' | xargs -i mysqladmin -u 'USERNAME' -p'PASSWORD' kill {}
Chúng tôi có thể làm điều đó bằng MySQL Workbench. Chỉ cần thực hiện điều này:
kill id;
Thí dụ:
kill 13412
Điều đó sẽ loại bỏ nó.
#! /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;
Đôi khi tôi có một số quy trình mysql zombie không thể bị giết (sử dụng MAMP Pro).
Trước tiên, hãy lấy danh sách tất cả các quy trình mysql:
ps -ax | grep mysql
Tiếp theo, hãy giết từng cái trong số chúng bằng (thay thế processId bằng cột đầu tiên trong kết quả lệnh trước đó):
kill -9 processId
Những điều sau đây rất hiệu quả đối với tôi:
echo "show processlist" | mysql | grep -v ^Id | awk '{print $1}' | xargs -i echo "KILL {}; | mysql"
Tôi đã sử dụng lệnh flush tables
để loại bỏ tất cả các kết nối không hoạt động mà thực sự là sự cố hàng loạt.
đối với ngôn ngữ python, bạn có thể làm như thế này
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()
Nếu bạn đang sử dụng laravel thì cái này dành cho bạn:
$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));
}
}
Tất nhiên, bạn nên sử dụng điều này use Illuminate\Support\Facades\DB;
sau vùng tên của mình.
Truy vấn 1 chọn concat ('KILL', id, ';') từ information_schema.processlist trong đó user = 'username' vào outfile '/tmp/a.txt';
Truy vấn 2 nguồn a.txt
Điều này sẽ cho phép bạn loại bỏ tất cả các truy vấn trong danh sách xử lý hiển thị của người dùng cụ thể.
sudo service mysqld restart