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.


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

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")

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.


13

Atau ... dalam cangkang ...

service mysql restart

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


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.


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;

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.


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;

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

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)

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

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

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


2
mysqladmin pr -u 'USERNAME' -p'PASSWORD' | awk '$2~/^[0-9]+/{print $2}' | xargs -i mysqladmin -u 'USERNAME' -p'PASSWORD' kill {}

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.


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)


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;

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

0

Berikut ini bekerja sangat baik untuk saya:

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

0

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


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()

-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.


-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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.