¿Cómo puedo detener una consulta MySQL en ejecución?

258

Me conecto mysqldesde mi shell de Linux. De vez en cuando ejecuto una SELECTconsulta que es demasiado grande. Imprime e imprime y ya sé que esto no es lo que quise decir. Me gustaría detener la consulta.

Golpear Ctrl+C(un par de veces) mata por mysqlcompleto y me lleva de vuelta al cascarón, así que tengo que volver a conectarme.

¿Es posible detener una consulta sin suicidarse mysql?

David B
fuente
1
Vale la pena mencionar que MySQL 5.7 admite un tiempo de espera de instrucción SELECT del lado del servidor. Más información sobre esto aquí: mysqlserverteam.com/server-side-select-statement-timeouts
Morgan Tocker

Respuestas:

462
mysql>show processlist;

mysql> kill "number from first col";
baklarz2048
fuente
1
Gracias, ¡solo sabía cómo hacerlo en phpmyadmin!
Zilverdistel
55
pero mysqlestá imprimiendo ... No puedo ver el mensaje
David B
34
Estoy de acuerdo con este enfoque básico, pero creo que usarlo KILL QUERYes ligeramente preferible KILLpara este caso. De esa forma, se elimina la consulta, pero no la conexión.
Ike Walker
3
Un consejo útil si su lista de procesos se desplaza más allá de su búfer es configurar el localizador. Simplemente ingrese '\ P more' en el indicador. Vea más sobre este consejo aquí dbasquare.com/2012/03/28/…
Scott
1
Si usa MySQL en AWS RDS, no tendrá permiso para ejecutar KILL, pero puede ejecutar:CALL mysql.rds_kill(12345)
Kip
70

Solo para agregar

KILL QUERY **Id** de dónde es la identificación de la conexión show processlist

es más preferible si no desea eliminar la conexión, generalmente cuando se ejecuta desde alguna aplicación.

Para más detalles, puede leer el documento de MySQL aquí

maaz
fuente
Una pregunta que tenía relacionada con esto es: ¿la conexión solo reaparece, o al finalizar las conexiones el resultado es que el tamaño del grupo es demasiado pequeño para que la aplicación se ejecute?
Tío Iroh
48

Conéctate a mysql

mysql -uusername -p  -hhostname

muestre la lista de procesos completa:

mysql> show full processlist;
+---------+--------+-------------------+---------+---------+------+-------+------------------+
| Id      | User   | Host              | db      | Command | Time | State | Info             |
+---------+--------+-------------------+---------+---------+------+-------+------------------+
| 9255451 | logreg | dmin001.ops:37651 | logdata | Query   |    0 | NULL  | show processlist |
+---------+--------+-------------------+---------+---------+------+-------+------------------+

Mata la consulta específica. Aquí id = 9255451

mysql> kill 9255451;

Si se le niega el permiso, intente este SQL:

CALL mysql.rds_kill(9255451)
minhas23
fuente
13
Nota: Esa última consulta es necesaria si se usa la instancia de AWS RDS.
Kip
13

Use mysqladminpara eliminar la consulta fuera de control:

Ejecute los siguientes comandos:

mysqladmin -uusername -ppassword pr

Luego anote la identificación del proceso.

mysqladmin -uusername -ppassword kill pid

La consulta fuera de control ya no debería consumir recursos.

minhas23
fuente
9

Si tiene mysqladmindisponible, puede obtener la lista de consultas con:

> mysqladmin -uUSERNAME -pPASSWORD pr

+-----+------+-----------------+--------+---------+------+--------------+------------------+
| Id  | User | Host            | db     | Command | Time | State        | Info             |
+-----+------+-----------------+--------+---------+------+--------------+------------------+
| 137 | beet | localhost:53535 | people | Query   | 292  | Sending data | DELETE FROM      |
| 145 | root | localhost:55745 |        | Query   | 0    |              | show processlist |
+-----+------+-----------------+--------+---------+------+--------------+------------------+

Entonces puede detener el proceso mysql que aloja la consulta de larga ejecución:

> mysqladmin -uUSERNAME -pPASSWORD kill 137
Rudy Lattae
fuente
6

Debe ejecutar el siguiente comando para eliminar el proceso.

> show processlist;  
> kill query processId;

El parámetro de consulta especifica que debemos eliminar el proceso del comando de consulta.

La sintaxis para matar proceso de la siguiente manera

MATAR [CONEXIÓN | QUERY] processlist_id

Por favor, consulte este enlace para más información.

Shivam Kubde
fuente
1

El autor de esta pregunta menciona que generalmente solo después de que MySQL imprime su salida, se da cuenta de que se ejecutó la consulta incorrecta. Como se señaló, en este caso, Ctrl-Cno ayuda. Sin embargo, he notado que abortará la consulta actual , si la detecta antes de que se imprima cualquier salida. Por ejemplo:

mysql> select * from jos_users, jos_comprofiler;

MySQL se ocupa de generar el producto cartesiano de las dos tablas anteriores y pronto se da cuenta de que MySQL no ha impreso ningún resultado en la pantalla (el estado del proceso es Enviando datos ), por lo que escribe Ctrl-C:

Ctrl-C -- sending "KILL QUERY 113240" to server ...
Ctrl-C -- query aborted.
ERROR 1317 (70100): Query execution was interrupted

Ctrl-Cde manera similar se puede usar para detener una UPDATEconsulta.

Anthony Geoghegan
fuente