Anuncios

Bienvenidos sean a este post, hoy veremos como abortar o eliminar las conexiones.

Anuncios
Anuncios

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

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.

Anuncios
Nota: 
Como ver los procesos lo vimos en el post anterior
Anuncios
Anuncios

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
Anuncios

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.

Anuncios

Vamos a comenzar ejecutando el siguiente comando:

MariaDB [(none)]> do sleep(2000);
Anuncios

Esto dejara en reposo en la conexion, abrimos otra conexion y desde esta ejecutaremos el siguiente comando:

MariaDB [(none)]> show processlist\G
Anuncios

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
Anuncios

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

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

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)]>
Anuncios

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.

Anuncios

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.

Anuncios
pp258

Donación

Es para mantenimento del sitio, gracias!

$1.50