Як я вбиваю всі процеси в Mysql "показати список процесів"?


121

Тому що я бачу там багато процесів, і стовпець "час" показує великі значення для всіх них.


Ви також можете перезапустити mysqld, наприклад,sudo service mysqld restart
philfreo

Відповіді:


108

Убивати їх потрібно по черзі, у MySQL немає жодної масивної команди вбити. Ви можете його скриптувати будь-якою мовою, наприклад, в PHP, ви можете використовувати щось на кшталт:

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

це гарна ідея. Спробуй перетворити це на скрипт оболонки на кроні ...!
М. Фараз

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

mysql -u -p -e "показати список переліку процесів;" | греп Сон | awk '{print $ 1}' | під час читання LINE; do mysql -u -p -e "вбити $ LINE"; зроблено
користувач3770797

213

Операція масового вбивства економить час. Зробіть це в самому MySql:

Виконайте ці команди

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

якщо ви не хочете зберігати файл, зберігайте його в variable

Просто запустіть у своєму командному рядку

> 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
Будь ласка, не забудьте посилатися на джерело: mysqlperformanceblog.com/2009/05/21/…
Артем Гуцул

2
@ArtemGoutsoul, але я не пам'ятаю, що я звернувся до цього сайту. Це моя власна тенденція робити це.
Анжелін Надар

@JanusTroelsen, але моя відповідь - через 3 роки '12
Ангелін Надар

1
@Angelin Nadar Дякую!
Срібло Світло

1
@ShankarDamodaran SURE
Ангелін Надар

16

Я також шукав, як проаналізувати MySQL команду SHOW PROCESSLIST і закінчився однолінійкою в оболонці:

mysqladmin processlist -u <USERNAME> -p<PASSWORD> | \
awk '$2 ~ /^[0-9]/ {print "KILL "$2";"}' | \
mysql -u <USERNAME> -p<PASSWORD>
  • mysqladmin processlist надрукує таблицю з ідентифікаторами потоку;
  • awk буде аналізувати з другого стовпця лише числа (ідентифікатори потоку) та генерувати команди MySQL KILL;
  • і нарешті останній виклик mysql виконає передані команди.

Ви можете запустити grep перед командою awk, щоб відфільтрувати певну назву бази даних.


13

Або ... в оболонці ...

service mysql restart

Так, я знаю, я ледачий, але це теж може бути зручно.


10
це дуже погана ідея ... особливо, якщо у вас встановлений двигун таблиці на пам'ять, тому що всі дані будуть втрачені ... або якщо ви використовуєте тип двигуна innodb, це призведе до того, що він повторить всі індекси при перезапуску
HellBaby

8
Також це вбиває весь процес у всіх базах даних
Дієго Андрес Діас Еспіноза

10

Це не стає простішим, ніж це, просто виконайте це у запиті mysql.

kill USER username;

Це знищить весь процес під наданим іменем користувача. тому що більшість людей використовують одного і того ж користувача для будь-яких цілей, це працює!

Я перевірив це на MariaDB не впевнений у mysql.


3
У якій версії MySQL це існує? Я не бачу це документально підтверджено у посиланні MySQL 5.7 ; немає ніяких доказів того, що можна вбити користувачем: KILL [CONNECTION | QUERY] processlist_id. Я спробував ваш запит у MySQL 5.6.34, і це вважається синтаксичною помилкою.
Birchlabs

4
Я спробував це в підказці 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 Можливо, ваша відповідь є особливістю, особливо для MariaDB.
Birchlabs

Це не працює для Mysql. Будь ласка, прочитайте, перш ніж публікувати поради, пов'язані з іншими системами БД ...
RyanH

7

Далі буде створено просту збережену процедуру, яка використовує курсор, щоб знищити всі процеси один за одним, за винятком використовуваного процесу:

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 ;

Його можна запустити з SELECTs, щоб показати процеси до і після, як показано нижче:

SELECT * FROM information_schema.processlist;
CALL kill_other_processes();
SELECT * FROM information_schema.processlist;

6

Нещодавно мені це потрібно було зробити, і я придумав це

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

Таким чином, вам не потрібно зберігати, щоб зберігати та виконувати всі запити однією командою.


5

Вбити ВСІ ВИБІРНІ ЗАПИТАННЯ

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

Якщо у вас немає інформації_схеми:

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

4

увійдіть в Mysql як адміністратор:

 mysql -uroot -ppassword;

І ніж запустити команду:

mysql> show processlist;

Ви отримаєте щось подібне нижче:

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

Ви побачите повну інформацію про різні з'єднання. Тепер ви можете вбити спальне з'єднання, як показано нижче:

mysql> kill 52;
Query OK, 0 rows affected (0.00 sec)

19
Це не відповідь на запитання. Тут ви вбиваєте один процес, тоді як питання полягає в тому, як ви можете вбити процес одразу.
Христо Петев

@ badbod99 Я опинився тут, шукаючи, як вбити процес mysql, і ця відповідь допомогла мені, тому я виступив із цим.
Богдан

3

Цей фрагмент працював для мене (MySQL сервер 5.5), щоб знищити всі процеси MySQL:

mysql -e "show full processlist;" -ss | awk '{print "KILL "$1";"}'| mysql

3

Я б поєднав bash і 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

Ось рішення, яке можна виконати, не покладаючись на операційну систему:

КРОК 1: Створіть збережену процедуру.

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 ;

КРОК 2: Викличте збережену процедуру, даючи їй ім'я користувача бази даних, процеси якого ви хочете вбити. Ви можете переписати збережену процедуру для фільтрації за іншими критеріями, якщо хочете.

НАЗВАЙТЕ 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
Гей там. Не впевнений, чи ви бот, спільнота чи людина, але все одно, було б чудово, якби ви додали кілька слів, що пояснюють, що відбувається з цим рядком коду і як це вирішує проблему?
Фелікс Ганьон-Греньє

1
Додано -u та -p, щоб надати доступ користувачеві ... робота добре!
Господь святий Іоанн

2

Ми можемо це зробити MySQL Workbench. Просто виконайте це:

kill id;

Приклад:

kill 13412

Це видалить його.


Це звучить кращою відповіддю, оскільки не було мови, згаданої вище.
DeshDeep Singh

0

Найпростішим способом було б перезапустити сервер mysql .. Відкрийте "services.msc" у Windows Run, виберіть Mysql зі списку. Клацніть правою кнопкою миші та зупиніть службу. Потім запустіть ще раз, і всі процеси будуть вбиті, крім одного (за замовчуванням зарезервоване з'єднання)


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

Іноді у мене є деякі функції mysql зомбі, які неможливо вбити (використовуючи MAMP Pro).

Спочатку отримайте список усіх mysql-процесів:

ps -ax | grep mysql

Далі вбийте кожен з них (замініть processId першим стовпцем у попередньому результаті команди):

kill -9 processId

0

Наступне працювало для мене чудово:

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

0

Я використав команду, flush tablesщоб знищити всі неактивні з'єднання, де, власне, маса проблема.


1
не працює. Розмийте таблиці, але підтримуйте режими сну активними
gtryonp

0

для мови пітона ви можете зробити так

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

Якщо ви використовуєте laravel, це для вас:

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

Звичайно, ви повинні використовувати це use Illuminate\Support\Facades\DB;після простору імен.


-4

Запит 1 виберіть concat ('KILL', id, ';') з information_schema.processlist, де user = 'ім'я користувача' у вихідному файлі '/tmp/a.txt';

Джерело запиту 2 a.txt

Це дасть змогу вбити всі запити у списку процесорів показу певним користувачем.


Я схвалив, тоді зрозумів, що ви просто скопіювали відповідь нижче rofl; stackoverflow.com/a/21547386/3652863
Robert Pounder

FYI це було моє власне, але що б там не було.
Саурав Суд
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.