Jawaban:
Anda harus membunuhnya satu per satu, MySQL tidak memiliki perintah kill besar-besaran. Anda dapat membuat skrip dalam bahasa apa pun, misalnya dalam PHP Anda dapat menggunakan sesuatu seperti:
$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
Operasi pembunuhan massal menghemat waktu. Lakukan di MySql sendiri:
Jalankan perintah ini
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------------
jika Anda tidak ingin menyimpan dalam file, simpan dalam file variable
Jalankan saja di command prompt Anda
> 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")
Saya juga telah mencari cara mengurai melalui MySQL perintah SHOW PROCESSLIST dan diakhiri dengan satu baris di Shell:
mysqladmin processlist -u <USERNAME> -p<PASSWORD> | \
awk '$2 ~ /^[0-9]/ {print "KILL "$2";"}' | \
mysql -u <USERNAME> -p<PASSWORD>
Anda dapat menjalankan grep sebelum perintah awk untuk memfilter nama database tertentu.
Atau ... dalam cangkang ...
service mysql restart
Ya, saya tahu, saya malas, tapi itu bisa berguna juga.
Itu tidak lebih sederhana dari ini, Cukup jalankan ini di prompt mysql.
kill USER username;
Ini akan mematikan semua proses di bawah nama pengguna yang disediakan. karena sebagian besar orang menggunakan pengguna yang sama untuk semua tujuan, itu berhasil!
Saya telah menguji ini di MariaDB tidak yakin tentang mysql.
KILL [CONNECTION | QUERY] processlist_id
. Saya mencoba kueri Anda di MySQL 5.6.34 dan itu dianggap sebagai kesalahan sintaks.
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
Mungkin jawaban Anda adalah fitur khusus MariaDB saja.
Berikut ini akan membuat prosedur tersimpan sederhana yang menggunakan kursor untuk mematikan semua proses satu per satu kecuali untuk proses yang sedang digunakan:
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 ;
Ini dapat dijalankan dengan SELECT
s untuk menunjukkan proses sebelum dan sesudah sebagai berikut:
SELECT * FROM information_schema.processlist;
CALL kill_other_processes();
SELECT * FROM information_schema.processlist;
Saya baru-baru ini perlu melakukan ini dan saya datang dengan ini
-- 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;
Dengan begitu, Anda tidak perlu menyimpan ke file dan menjalankan semua kueri dengan satu perintah.
BUNUH SEMUA KUERI PILIHAN
select concat('KILL ',id,';')
from information_schema.processlist
where user='root'
and INFO like 'SELECT%' into outfile '/tmp/a.txt';
source /tmp/a.txt;
login ke Mysql sebagai admin:
mysql -uroot -ppassword;
Dan daripada menjalankan perintah:
mysql> show processlist;
Anda akan mendapatkan sesuatu seperti di bawah ini:
+----+-------------+--------------------+----------+---------+------+-------+------------------+
| 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 |
+----+-------------+--------------------+----------+---------+------+-------+------------------+
Anda akan melihat detail lengkap dari koneksi yang berbeda. Sekarang Anda dapat mematikan koneksi tidur seperti di bawah ini:
mysql> kill 52;
Query OK, 0 rows affected (0.00 sec)
Potongan ini berfungsi untuk saya (MySQL server 5.5) untuk mematikan semua proses MySQL:
mysql -e "show full processlist;" -ss | awk '{print "KILL "$1";"}'| mysql
Berikut adalah solusi yang dapat Anda jalankan tanpa bergantung pada sistem operasi:
LANGKAH 1: Buat prosedur tersimpan.
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 ;
LANGKAH 2: Panggil prosedur tersimpan dengan memberinya nama pengguna database yang prosesnya ingin Anda matikan. Anda dapat menulis ulang prosedur yang tersimpan untuk memfilter beberapa kriteria lain jika Anda mau.
PANGGILAN kill_user_processes('devdba');
mysqladmin pr -u 'USERNAME' -p'PASSWORD' | awk '$2~/^[0-9]+/{print $2}' | xargs -i mysqladmin -u 'USERNAME' -p'PASSWORD' kill {}
Kita bisa melakukannya dengan MySQL Workbench. Jalankan saja ini:
kill id;
Contoh:
kill 13412
Itu akan menghapusnya.
#! /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;
Terkadang saya memiliki beberapa proses mysql zombie yang tidak dapat dibunuh (menggunakan MAMP Pro).
Pertama dapatkan daftar semua proses mysql:
ps -ax | grep mysql
Selanjutnya bunuh semuanya dengan (ganti processId dengan kolom pertama di hasil perintah sebelumnya):
kill -9 processId
Berikut ini bekerja sangat baik untuk saya:
echo "show processlist" | mysql | grep -v ^Id | awk '{print $1}' | xargs -i echo "KILL {}; | mysql"
untuk bahasa python, Anda bisa melakukan seperti ini
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()
Jika Anda menggunakan laravel maka ini untuk Anda:
$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));
}
}
Tentu saja, Anda harus menggunakan ini use Illuminate\Support\Facades\DB;
setelah namespace Anda.
Query 1 pilih concat ('KILL', id, ';') dari information_schema.processlist dimana user = 'username' ke outfile '/tmp/a.txt';
Kueri 2 sumber a.txt
Ini akan memungkinkan Anda untuk membunuh semua kueri dalam daftar proses acara oleh pengguna tertentu.
sudo service mysqld restart