Bagaimana cara saya menghentikan semua proses di "show processlist" Mysql?

121

Karena saya melihat banyak proses di sana, dan kolom "waktu" menunjukkan nilai besar untuk semuanya.

TIMEX
sumber
Anda juga dapat memulai ulang mysqld, misalnya,sudo service mysqld restart
philfreo

Jawaban:

108

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);
  }
}
Michal Čihař
sumber
itu ide yang bagus. Biar saya coba mengubahnya menjadi skrip shell di cron ...!
M. Faraz
4
Shellfor i in {994..1145}; do mysql -uroot -p123456 -e "kill $i" ; done
zhuguowei
mysql -u -p -e "tampilkan daftar proses;" | grep Tidur | awk '{print $ 1}' | saat membaca LINE; lakukan mysql -u -p -e "kill $ LINE"; selesai
user3770797
213

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;

Referensi

---------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")
Angelin Nadar
sumber
13
Harap ingat untuk merujuk ke sumber: mysqlperformanceblog.com/2009/05/21/…
Artem Goutsoul
2
@ArtemGoutsoul tapi saya tidak ingat saya merujuk ke situs ini. Itu adalah tren saya sendiri dalam melakukan ini.
Angelin Nadar
@JanusTroelsen tetapi jawaban saya adalah setelah 3 tahun '12
Angelin Nadar
1
@Angelin Nadar Terima kasih!
Silver Light
1
@ShankarDamodaran PASTI
Angelin Nadar
16

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>
  • daftar proses mysqladmin akan mencetak tabel dengan id utas;
  • awk akan mengurai dari kolom kedua hanya nomor (id thread) dan menghasilkan perintah MySQL KILL;
  • dan akhirnya panggilan terakhir ke mysql akan menjalankan perintah yang diteruskan.

Anda dapat menjalankan grep sebelum perintah awk untuk memfilter nama database tertentu.

m8t
sumber
13

Atau ... dalam cangkang ...

service mysql restart

Ya, saya tahu, saya malas, tapi itu bisa berguna juga.

EcchiOli
sumber
10
ini adalah ide yang sangat buruk ... khususnya jika Anda memiliki mesin tabel yang disetel pada memori, menyebabkan semua data akan hilang ... atau jika Anda menggunakan tipe mesin innodb, karena itu akan mengulang semua indeks saat restart
HellBaby
8
Juga mematikan semua proses pada semua database
Diego Andrés Díaz Espinoza
10

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.

Maulik Gangani
sumber
3
Di versi MySQL apa ini ada? Saya tidak melihatnya didokumentasikan dalam referensi MySQL 5.7 ; tidak ada bukti bahwa hal itu mungkin untuk membunuh oleh pengguna: KILL [CONNECTION | QUERY] processlist_id. Saya mencoba kueri Anda di MySQL 5.6.34 dan itu dianggap sebagai kesalahan sintaks.
Birchlabs
4
Saya telah mencoba ini di prompt 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 Mungkin jawaban Anda adalah fitur khusus MariaDB saja.
Birchlabs
Ini tidak berfungsi untuk Mysql. Harap baca sebelum memposting saran yang berkaitan dengan sistem DB lain ...
RyanH
7

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 SELECTs untuk menunjukkan proses sebelum dan sesudah sebagai berikut:

SELECT * FROM information_schema.processlist;
CALL kill_other_processes();
SELECT * FROM information_schema.processlist;
Steve Chambers
sumber
6

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.

Iberê
sumber
5

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;
pengguna3269995
sumber
5

Jika Anda tidak memiliki information_schema:

mysql -e "show full processlist" | cut -f1 | sed -e 's/^/kill /' | sed -e 's/$/;/' ;  > /tmp/kill.txt
mysql> . /tmp/kill.txt
mikesl
sumber
4

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)
Suresh Kamrushi
sumber
19
Ini bukanlah jawaban atas pertanyaan tersebut. Di sini Anda membunuh satu proses sementara pertanyaannya adalah bagaimana Anda bisa menghentikan proses sekaligus.
Hristo Petev
@ badbod99 Saya akhirnya di sini mencari cara untuk mematikan proses mysql dan jawaban ini membantu saya jadi saya menaikkan suara itu.
Bogdan
3

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
Fedir RYKHTIK
sumber
3

Saya akan menggabungkan bash dan 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
wiebel
sumber
2

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');

Dan Spiegel
sumber
2
mysqladmin pr -u 'USERNAME' -p'PASSWORD' | awk '$2~/^[0-9]+/{print $2}' | xargs -i mysqladmin -u 'USERNAME' -p'PASSWORD' kill {}
pengguna3721740
sumber
1
Hei yang disana. Tidak yakin apakah Anda bot, Komunitas, atau manusia, tetapi bagaimanapun, akan sangat bagus jika Anda menambahkan beberapa kata yang menjelaskan apa yang terjadi dengan baris kode ini dan bagaimana cara itu menyelesaikan masalah yang dihadapi?
Félix Gagnon-Grenier
1
Menambahkan -u dan -p untuk memberikan akses ke pengguna ... berfungsi dengan baik!
Lord St John
2

Kita bisa melakukannya dengan MySQL Workbench. Jalankan saja ini:

kill id;

Contoh:

kill 13412

Itu akan menghapusnya.

Aroon
sumber
Ini terdengar jawaban yang lebih baik karena tidak ada bahasa yang disebutkan di atas.
DeshDeep Singh
0

Cara termudah adalah dengan me-restart server mysql .. Buka "services.msc" di windows Run, pilih Mysql dari daftar. Klik kanan dan hentikan layanan. Kemudian Mulai lagi dan semua proses akan dimatikan kecuali yang satu (koneksi cadangan default)

shashi009
sumber
0
#! /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;
Diego Andrés Díaz Espinoza
sumber
0

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
Nico Prat
sumber
0

Berikut ini bekerja sangat baik untuk saya:

echo "show processlist" | mysql | grep -v ^Id | awk '{print $1}' | xargs -i echo "KILL {}; | mysql"
Timon de Groot
sumber
0

Saya menggunakan perintah flush tablesuntuk membunuh semua koneksi yang tidak aktif yang sebenarnya merupakan masalah massal.

Meltzer
sumber
1
tidak bekerja. Siram tabel tetapi pertahankan
koneksi
0

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()
BohanZhang
sumber
-1

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.

Ziaur Rahman
sumber
-4

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.

Saurav Sood
sumber
Saya memberikan suara positif kemudian menyadari bahwa Anda baru saja menyalin jawaban di bawah rofl; stackoverflow.com/a/21547386/3652863
Robert Pounder
FYI itu milik saya sendiri, tapi terserah.
Saurav Sood