2009-12-14 98 views

Respuesta

84

Tienes que matarlos uno por uno, MySQL no tiene ningún comando de muerte masiva. Puede que la escritura en cualquier idioma, por ejemplo en PHP se puede usar algo como:

$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

que es una buena idea. Déjame intentar convertir eso a un script de shell en un cron ...! –

+3

Shell 'para i en {994..1145}; do mysql -uroot -p123456 -e "kill $ i"; hecho' – zhuguowei

+0

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

162

misa matar operación ahorra tiempo. Hacerlo por sí MySQL:

Ejecutar estos comandos

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

si no desea almacenar en archivo, guardar en un variable

Sólo tiene que ejecutar en su símbolo del sistema

> 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

Por favor, recuerde consultar la fuente: http://www.mysqlperformanceblog.com/2009/05/21/mass-killing-of-mysql-connections/ –

+2

@ArtemGoutsoul, pero no recuerdo que hice referencia a este sitio. Es mi propia tendencia de hacer esto. –

+0

mi blog http://angelinnadar.blogspot.in/ donde puedes encontrar cosas similares –

15

también han buscado cómo analizar a través de MySQL el comando SHOW PROCESSLIST y terminó con una sola línea en una Shell:

mysqladmin processlist -u <USERNAME> -p<PASSWORD> | \ 
awk '$2 ~ /^[0-9]/ {print "KILL "$2";"}' | \ 
mysql -u <USERNAME> -p<PASSWORD> 
  • processlist mysqladmin imprimirá una tabla con los identificadores de hilo;
  • awk analizará desde la segunda columna solo los números (identificadores de subprocesos) y generará comandos MySQL KILL;
  • y finalmente la última llamada a mysql ejecutará los comandos pasados.

Puede ejecutar grep antes del comando awk para filtrar un nombre de base de datos en particular.

5

Si usted no tiene INFORMATION_SCHEMA:

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

6

de acceso a MySQL como administrador:

mysql -uroot -ppassword; 

Y que ejecuta el comando:

mysql> show processlist; 

Va a conseguir algo como abajo:

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

Verás los detalles completos de las diferentes conexiones.Ahora se puede matar a la conexión de dormir de la siguiente manera:

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

Esta no es la respuesta a la pregunta. Aquí está matando a un solo proceso, mientras que la pregunta es cómo puede matar el proceso de una vez. –

+2

Si pudiera volver a votar esto de nuevo, lo haría – badbod99

4

matar a todas las consultas de selecció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; 
3

Aquí es una solución que puede ejecutar sin depender del sistema operativo:

PASO 1: Crea un procedimiento almacenado.

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 ; 

PASO 2: Llame al procedimiento almacenado que le da el nombre de un usuario de base de datos cuyos procesos desea eliminar. Podría reescribir el procedimiento almacenado para filtrar otros criterios si lo desea.

LLAMADA kill_user_processes('devdba');

0

Una manera fácil sería para reiniciar el servidor MySQL .. abierto "services.msc" en la ventana de Ejecutar, seleccione MySQL de la lista. Haga clic derecho y pare el servicio. A continuación, empezar de nuevo y todos los procesos que se han muerto, excepto el uno (el valor por defecto reservado conexión)

10

O ... con cáscara ...

service mysql restart 

Sí, lo sé, soy vago, pero también puede ser útil.

+7

esta es una muy mala idea ... en especial si tiene el motor de tabla configurado en la memoria, porque se perderán todos los datos ... o si usa el tipo de motor innodb, causa volverá a hacer todos los índices al reiniciar – HellBaby

+6

También mata todo el proceso en todas las bases de datos –

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

Hola. No estoy seguro si eres un bot, un miembro de la comunidad o un ser humano, pero de todos modos, sería genial si agregases algunas palabras para explicar qué está pasando con esta línea de código y cómo resuelve el problema. –

+0

Hola, por favor haga una pregunta ... – user3721740

+1

Agregué el -u y -p para dar acceso al usuario ... ¡el trabajo está bien! –

2

recientemente que tenía que hacer esto y se me ocurrió con esta

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

De esta manera, no es necesario almacenar en un archivo y ejecutar todas las consultas con un solo comando.

-3

Consultar 1 seleccionar concat ('KILL', id, ';') de information_schema.processlist donde user = 'username' en el archivo '/tmp/a.txt';

Consulta 2 fuente a.txt

Esto permitirá que mates a todas las consultas de espectáculo processlist por el usuario específico.

+0

Me upvoted luego me di cuenta de que acaba de copiar la respuesta a continuación rofl; https://stackoverflow.com/a/21547386/3652863 –

+0

FYI era de mi propiedad, pero lo que sea. –

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

Esta cortó trabajó para mí (servidor MySQL 5.5) para matar todos los procesos de MySQL:

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

Lo siguiente creará un procedimiento almacenado simple que utiliza un cursor para matar todos los procesos, uno por uno, excepto para el proceso que está siendo actualmente utilizado:

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 ; 

se puede ejecutar con SELECT s para mostrar los procesos antes y después de la siguiente manera:

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

No hay nada más sencillo que esto, simplemente ejecute esto en el indicador mysql.

kill USER username; 

Matará todo el proceso con el nombre de usuario proporcionado. porque la mayoría de la gente usa el mismo usuario para todos los propósitos, ¡funciona!

He probado esto en MariaDB no estoy seguro sobre mysql.

+1

¿En qué versión de MySQL existe esto?No lo veo documentado en la [referencia de MySQL 5.7] (https://dev.mysql.com/doc/refman/5.7/en/kill.html); no hay evidencia de que sea posible matar por el usuario: 'KILL [CONNECTION | QUERY] processlist_id'. Intenté tu consulta en MySQL 5.6.34 y se consideró un error de sintaxis. – Birchlabs

+0

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

+1

He intentado esto en el indicador de MySQL 5.6.34: 'mysql> kill user root; ERROR 1064 (42000): Tiene un error en la sintaxis SQL; revise el manual que corresponde a su versión del servidor MySQL para la sintaxis correcta para usar cerca de 'root' en la línea 1' Probablemente su respuesta sea una característica exclusiva de MariaDB. – Birchlabs

0

A veces tengo algunos procesos zombies mysql que no se pueden matar (usando MAMP Pro).

En primer lugar obtener una lista de todos los procesos de MySQL:

ps -ax | grep mysql 

Siguiente matar a cada uno de ellos con (sustituir processId con la primera columna de los resultados anteriores de comandos):

kill -9 processId 
0

La siguiente trabajados ideal para mí:

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

He utilizado el comando flush tables para matar a todos los i conexiones nactivas que en realidad son el problema de masas.

0

Podemos hacerlo mediante MySQL Workbench. Sólo hay que ejecutar esto:

kill id; 

Ejemplo:

kill 13412 

Eso lo eliminará.

Cuestiones relacionadas