Làm cách nào để hủy tất cả các quy trình trong Mysql "hiển thị danh sách quy trình"?


121

Bởi vì tôi thấy rất nhiều quy trình ở đó và cột "thời gian" hiển thị các giá trị lớn cho tất cả chúng.


Bạn có thể mysqld cũng khởi động lại, ví dụ:sudo service mysqld restart
philfreo

Câu trả lời:


108

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

Ý tưởng hay đấy. Lemme hãy thử chuyển đổi nó thành một tập lệnh shell trên cron ...!
M. Faraz

4
Shellfor i in {994..1145}; do mysql -uroot -p123456 -e "kill $i" ; done
zhuguowei 16/02/16

mysql -u -p -e "hiển thị danh sách xử lý;" | grep Ngủ | awk '{print $ 1}' | trong khi đọc LINE; làm mysql -u -p -e "giết $ LINE"; xong
dùng3770797

213

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;

Tài liệu tham khảo

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

13
Hãy nhớ để tham khảo các nguồn: mysqlperformanceblog.com/2009/05/21/...
Artem Goutsoul

2
@ArtemGoutsoul nhưng tôi không nhớ mình đã tham khảo trang web này. Đó là xu hướng làm việc này của riêng tôi.
Angelin Nadar

@JanusTroelsen nhưng câu trả lời của tôi là sau 3 năm '12
Angelin Nadar 31/113

1
@Angelin Nadar Cảm ơn bạn!
Silver Light

1
@ShankarDamodaran CHẮC CHẮN
Angelin Nadar,

16

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>
  • danh sách quy trình mysqladmin sẽ in một bảng với id chủ đề;
  • awk sẽ phân tích cú pháp từ cột thứ hai chỉ các số (id luồng) và tạo các lệnh MySQL KILL;
  • và cuối cùng lời gọi cuối cùng tới mysql sẽ thực hiện các lệnh đã truyền.

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


13

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.


10
đây là một ý tưởng rất tồi ... đặc biệt nếu bạn đặt công cụ bảng trên bộ nhớ, khiến tất cả dữ liệu sẽ bị mất ... hoặc nếu bạn sử dụng loại công cụ innodb, nó sẽ làm lại tất cả các chỉ mục khi khởi động lại
HellBaby

8
Ngoài ra nó giết chết tất cả các quá trình trên tất cả các cơ sở dữ liệu
Diego Andrés Díaz Espinoza

10

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


3
Điều này tồn tại trong phiên bản MySQL nào? Tôi không thấy nó được ghi lại trong tài liệu tham khảo MySQL 5.7 ; không có bằng chứng cho thấy nó có thể giết bởi người sử dụng: 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.
Birchlabs

4
Tôi đã thử điều này trong lời nhắc 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 Có thể câu trả lời của bạn là một tính năng dành riêng cho MariaDB.
Birchlabs

Điều này không hoạt động cho Mysql. Vui lòng đọc trước khi đăng lời khuyên liên quan đến các hệ thống DB khác ...
RyanH

7

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 SELECTs để 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;

6

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.


5

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;

5

Nếu bạn không có information_schema:

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

4

đă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)

19
Đây không phải là câu trả lời cho câu hỏi. Ở đây bạn đang giết một quá trình duy nhất trong khi câu hỏi là làm thế nào bạn có thể giết quá trình cùng một lúc.
Hristo Petev,

@ badbod99 Tôi đã kết thúc ở đây để tìm cách giết quá trình mysql và câu trả lời này đã giúp tôi nên tôi đã ủng hộ nó.
Bogdan

3

Đ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

3

Tôi sẽ kết hợp bash và 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

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


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

1
Này đó. Không chắc bạn là bot, Cộng đồng hay con người nhưng dù sao, sẽ thật tuyệt nếu bạn thêm một số từ giải thích những gì đang xảy ra với dòng mã này và cách nó giải quyết vấn đề đang diễn ra?
Félix Gagnon-Grenier

1
Đã thêm -u và -p để cấp quyền truy cập cho người dùng ... công việc ổn!
Lord St John

2

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


Câu trả lời này nghe có vẻ tốt hơn vì không có ngôn ngữ được đề cập ở trên.
DeshDeep Singh

0

Một cách dễ dàng sẽ là khởi động lại máy chủ mysql .. Mở "services.msc" trong windows Run, chọn Mysql từ danh sách. Nhấp chuột phải và dừng dịch vụ. Sau đó Bắt đầu lại và tất cả các quá trình sẽ bị giết ngoại trừ một (kết nối dành riêng mặc định)


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

Đô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

0

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"

0

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.


1
không hoạt động. Tuôn bảng nhưng duy trì coonections ngủ tích cực
gtryonp

0

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

-1

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.


-4

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


Tôi đã ủng hộ sau đó nhận ra bạn vừa sao chép câu trả lời bên dưới rofl; stackoverflow.com/a/21547386/3652863
Robert Pounder

FYI nó là của riêng tôi, nhưng bất cứ điều gì.
Saurav Sood
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.