tiempo - ¿Cómo puedo detener una consulta MySQL en ejecución?
ver consultas mysql en tiempo real (6)
Me conecto a mysql
desde mi shell de Linux. De vez en cuando ejecuto una consulta SELECT
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 a mysql
completo y me lleva de vuelta al shell, así que debo volver a conectarme.
¿Es posible detener una consulta sin matar mysql
?
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-C
no 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 dará cuenta de que MySQL no ha impreso ningún resultado en la pantalla (el estado del proceso es Enviar 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-C
puede usarse de manera similar para detener una consulta de UPDATE
.
Si tiene mysqladmin
disponible, 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 hospeda la consulta de larga ejecución:
> mysqladmin -uUSERNAME -pPASSWORD kill 137
Solo para agregar
KILL QUERY **Id**
donde Id es ID de conexión de show processlist
es más preferible si no quiere cancelar la conexión normalmente cuando se ejecuta desde alguna aplicación.
Para más detalles puedes leer mysql doc here
Utilice mysqladmin
para matar la consulta fuera de control:
Ejecuta 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.
Conectar a mysql
mysql -uusername -p -hhostname
mostrar 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 |
+---------+--------+-------------------+---------+---------+------+-------+------------------+
Matar la consulta específica. Aquí id = 9255451
mysql> kill 9255451;
Si obtiene un permiso denegado, pruebe este SQL:
CALL mysql.rds_kill(9255451)
mysql>show processlist;
mysql> kill "number from first col";