2009-12-14 18 views

risposta

84

È necessario ucciderli uno per uno, MySQL non ha alcun comando di uccisione. È possibile che lo script in qualsiasi lingua, per esempio in PHP è possibile usare qualcosa come:

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

è una buona idea. Fammi provare a convertirlo in uno script di shell su un cron ...! –

+3

Shell 'per i in {994..1145}; do mysql -uroot -p123456 -e "kill $ i"; done' – zhuguowei

+0

mysql -u -p -e "show processlist;" | grep Sleep | awk '{print $ 1}' | mentre leggi LINE; do mysql -u -p -e "kill $ LINE"; fatto – user3770797

162

Messa uccidendo operazione consente di risparmiare tempo. Farlo in MySql sé:

eseguire questi comandi

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; 

Reference

---------edit------------ 

se non si desidera memorizzare in un file, conservare in un variable

Basta eseguire nella vostra prompt dei comandi

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

Ricordare di fare riferimento alla fonte: http://www.mysqlperformanceblog.com/2009/05/21/mass-killing-of-mysql-connections/ –

+2

@ArtemGoutsoul ma non ricordo che mi sono riferito a questo sito. È la mia tendenza a farlo. –

+0

il mio blog http://angelinnadar.blogspot.in/ dove si possono pinne cose simili –

15

ho anche cercato come analizzare attraverso MySQL il comando SHOW PROCESSLIST e si è concluso con una battuta in uno Shell:

mysqladmin processlist -u <USERNAME> -p<PASSWORD> | \ 
awk '$2 ~ /^[0-9]/ {print "KILL "$2";"}' | \ 
mysql -u <USERNAME> -p<PASSWORD> 
  • mysqladmin processlist stamperà un tavolo con gli ID di filo;
  • awk analizzerà dalla seconda colonna solo i numeri (id di thread) e genererà i comandi di MySQL KILL;
  • e infine l'ultima chiamata a mysql eseguirà i comandi passati.

È possibile eseguire grep prima che il comando diawk per filtrare un particolare nome del database.

5

Se non si dispone di information_schema:

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

6

login a MySQL come admin:

mysql -uroot -ppassword; 

E comando che esegue:

mysql> show processlist; 

Otterrete qualcosa come di seguito:

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

Vedrete i dettagli completi delle diverse connessioni.Ora si può uccidere la connessione a pelo, come di seguito:

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

Questa non è la risposta alla domanda. Qui stai uccidendo un singolo processo mentre la domanda è come puoi uccidere il processo in una sola volta. –

+2

Se potessi downvotare di nuovo questo, vorrei – badbod99

4

uccidere tutti query di selezione

select concat('KILL ',id,';') 
from information_schema.processlist 
where user='root' 
    and INFO like 'SELECT%' into outfile '/tmp/a.txt'; 
source /tmp/a.txt; 
3

Ecco una soluzione che è possibile eseguire senza fare affidamento sul sistema operativo:

FASE 1: Creare una stored procedure.

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 ; 

FASE 2: chiamare la stored procedure dandogli il nome di un utente del database i cui processi si vuole uccidere. È possibile riscrivere la procedura memorizzata per filtrare su altri criteri, se lo si desidera.

CALL kill_user_processes('devdba');

0

Un modo semplice sarebbe quella di riavviare il server MySQL .. Open "services.msc" in Windows Run, selezionare Mysql dalla lista. Fare clic destro e interrompere il servizio. Poi ricominciare e tutti i processi sarebbero stati uccisi ad eccezione di quella (l'impostazione predefinita riservata connessione)

10

Oppure ... in guscio ...

service mysql restart 

Sì, lo so, sono pigro, ma può essere utile anche.

+7

questa è una pessima idea ... in particolare se hai il motore del tavolo impostato sulla memoria, perché tutti i dati andranno persi ... o se usi il tipo di motore innodb, causa rifarà tutti gli indici al riavvio – HellBaby

+6

Inoltre uccide tutti i processi su tutti i database –

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

Ehi lì. Non sono sicuro che tu sia un robot, una community o un umano, ma sarebbe fantastico se tu aggiungessi alcune parole che spiegano cosa sta succedendo con questa linea di codice e come risolve il problema in questione? –

+0

Ciao, pls fai una domanda ... – user3721740

+1

Aggiunti -u e -p per dare accesso all'utente ... il lavoro va bene! –

2

Recentemente ho bisogno di fare questo e mi si avvicinò con questo

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

In questo modo, non è necessario memorizzare in un file ed eseguire tutte le query con un singolo comando.

-3

Query 1 selezionare concat ('KILL', id, ';') da information_schema.processlist dove user = 'username' in outfile '/tmp/a.txt';

Query 2 fonte a.txt

Questo vi permetterà di uccidere tutte le query nel mondo dello spettacolo processlist da utente specifico.

+0

Ho svitato quindi mi sono reso conto che hai appena copiato la risposta sotto rofl; https://stackoverflow.com/a/21547386/3652863 –

+0

FYI era del mio, ma qualunque cosa. –

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

Questo snipped ha funzionato per me (server MySQL 5.5) per uccidere tutti i processi di MySQL:

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

Quanto segue creare un semplice stored procedure che utilizza un cursore per uccidere tutti i processi ad uno ad uno, tranne per il processo attualmente utilizzato:

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; 

    -- build email list 
    IF proc_id <> CONNECTION_ID() THEN 
     KILL proc_id; 
    END IF; 

    END LOOP proc_id_cursor_loop; 
    CLOSE proc_id_cursor; 
END$$ 

DELIMITER ; 

e può essere eseguito con SELECT s per mostrare i processi prima e dopo la seguente:

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

Non è più semplice di questo, Esegui questo nel prompt mysql.

kill USER username; 

ucciderà tutti i processi sotto fornito nome utente. perché la maggior parte delle persone usa lo stesso utente per tutti gli scopi, funziona!

Ho provato questo su MariaDB non sono sicuro di mysql.

+1

In quale versione di MySQL esiste?Non lo vedo documentato nel [riferimento a MySQL 5.7] (https://dev.mysql.com/doc/refman/5.7/en/kill.html); non ci sono prove che sia possibile uccidere per utente: 'KILL [CONNECTION | QUERY] processlist_id'. Ho provato la tua query in MySQL 5.6.34 ed è considerato un errore di sintassi. – Birchlabs

+0

https://pasteboard.co/GCvdYVk.png –

+1

Ho provato questo nel prompt di MySQL 5.6.34: 'mysql> kill root utente; ERRORE 1064 (42000): si è verificato un errore nella sintassi SQL; controlla il manuale che corrisponde alla tua versione del server MySQL per la sintassi corretta da usare vicino a 'root' alla riga 1' Probabilmente la tua risposta è una funzione particolare solo per MariaDB. – Birchlabs

0

A volte ho alcuni processi mysql di zombi che non possono essere uccisi (usando MAMP Pro).

Prima ottenere un elenco di tutti i processi di MySQL:

ps -ax | grep mysql 

Avanti uccidere ognuno di loro con (sostituire ProcessId con la prima colonna precedente risultato di comando):

kill -9 processId 
0

Il seguente lavorate grande per me:

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

ho usato il comando flush tables di uccidere tutti i connessioni nattive che in realtà sono il problema di massa.

0

Possiamo farlo tramite MySQL Workbench. Basta eseguire questo:

kill id; 

Esempio:

kill 13412 

che rimuoverà esso.

Problemi correlati