Bienvenidos sean a este post, hoy veremos como abortar o eliminar las conexiones.
Si bien hasta ahora vimos como trabaja desde un thread por conexion a un pool de threads y luego como monitorear las conexiones hoy veremos como eliminarlas, esto puede ser realmente util cuando observamos que una conexion esta bloqueando al resto de los threads tal como mencionamos en este post, o bien puede suceder que encontremos una gran cantidad de procesos que estan durmiendo, en cualquiera de las dos situaciones necesitamos abortar o eliminar dichos threads que hacer trabajar de manera lenta o desperdician recursos de nuestro equipo, veamos su sintaxis:
KILL
[ HARD | SOFT ]
[ CONNECTION | QUERY [ID] ]
< id | USER nombre_usuario >
De manera predeterminada este comando elimina una conexion, la palabra CONNECTION que podemos utilizar es simplemente para ilustrarlo para el usuario, en cambio si usamos QUERY este eliminara el comando pero mantendra la conexion activa, lo obligatorio en este comando es el id de la conexion o de la ejecucion, aunque usemos a QUERY debemos especificar igualmente el id de la conexion, pero si especificamos a ID en lugar de especificar el id de conexion debemos especificar el id del query, recuerden que este dato lo obtenemos cuando hacemos un query a la tabla PROCESSLIST pero no con el comando SHOW PROCESSLIST.
Nota: Como ver los procesos lo vimos en el post anterior
Una alternativa que disponemos es utilizar la opcion USER donde podemos especificar el nombre o nombre de usuario para eliminar todas las conexiones o queries que pertenecen a este usuario, si necesitamos eliminar todas las conexiones o queries de nuestro usuario podemos usar a CURRENT_USER(), por ultimo tenemos la opcion de eliminar de manera suave (SOFT), manera predeterminada, la cual es mas lenta pero mas segura en cambio la dura (HARD) es mas rapida pero mas brutal a la hora de terminar operaciones y deberiamos usarla solamente si la opcion SOFT nos toma demasiado tiempo, aunque esto puede provocar una corrupcion de los datos, veamos porque:
- El comando KILL setea un flag en la conexion destino, si lo vemos con un SHOW PROCESSLIST en la columna Info aparece Killed
- Solamente cuando sea seguro se interrumpira la conexion por lo tanto la conexion destino chequea si se establecio el flag, en caso de ser cierto se procede con la finalizacion solicitada
- Algunas veces aunque no sea seguro la conexion chequea si HARD KILL fue solicitado y en caso de ser verdadero se procede con la finalizacion inmediatamente pero esto puede dejar una tabla en estado inconsistente
Pero en las versiones actuales, al momento de hacer este blog, estas diferencias solo conciernen a la reparacion de las tablas Arias o MyIsam y la creacion de los indices en tales tablas, por eso recuerden que los datos pueden quedar incluso mas corruptos que antes y sera necesario reconstruir el indice, veamos un ejemplo practico.
Vamos a comenzar ejecutando el siguiente comando:
MariaDB [(none)]> do sleep(2000);
Esto dejara en reposo en la conexion, abrimos otra conexion y desde esta ejecutaremos el siguiente comando:
MariaDB [(none)]> show processlist\G
El cual nos devolvera de todos los procesos pero vamos a enfocarnos en el que nos interesa:
*************************** 6. row ***************************
Id: 39
User: tinchicus
Host: localhost
db: NULL
Command: Query
Time: 9
State: User sleep
Info: do sleep(2000)
Progress: 0.000
En este caso es el proceso donde se esta ejecutando el comando anterior, de aqui sacaremos el id y lo eliminaremos de la siguiente manera:
MariaDB [(none)]> kill query 39;
En este caso simplemente le pedi que elimine el query para el id que posee, no termina la conexion, si todo se ejecuta correctamente en la primera conexion sucedera esto:
MariaDB [(none)]> do sleep(2000);
Query OK, 0 rows affected, 1 warning (40.760 sec)
Se interrumpira el query y nos notifica que hay un aviso, veamos cual es:
MariaDB [(none)]> show warnings;
+-------+------+---------------------------------+
| Level | Code | Message |
+-------+------+---------------------------------+
| Error | 1317 | Query execution was interrupted |
+-------+------+---------------------------------+
1 row in set (0.001 sec)
MariaDB [(none)]>
Otra forma podria haber sido ejecutando a SHOW PROCESSLIST donde nos hubiera informado el estado Killed, en cualquiera de los dos casos podemos ver como se nos notifico como se interrumpio al query.
En resumen, hoy hemos visto como interrumpir una conexion, inclusive como no interrumpir la conexion pero si su ejecucion, hemos visto las opciones que disponemos tanto de lo que deseamos eliminar asi como el modo y un pequeño ejemplo para verlo en accion, espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donación
Es para mantenimento del sitio, gracias!
$1.50
