Proceso para matar sesiones de MySQL bloqueadas
En entornos principalmente de lectura (sitios Web) con MySQL puede llegar a ser útil definir un script que mate las sesiones si llegan a un determinado número, ya que a partir de allí podemos pensar que se han bloqueado.
Mediante este script podemos solucionar automáticamente el colapso de la base de datos de un sitio web.
Resulta evidente que esta situación debe evitarse, pero llegado el caso que se produzca sin que se sepa el porqué puede servir como “último recurso“, ya que un operador entraría a hacer lo mismo pero manualmente.
#!/bin/bash
MATAPASS=root
MATALUSER=passwordrootmysql
LUSERDBKILL=ejemplodbuser
MAXSESS=500
MATAMAIL="tecnicos@systemadmin.es"
while true;
do
COUNT=$(echo "show full processlist;" | mysql -u $MATALUSER -p$MATAPASS | wc -l)
if [ $COUNT -gt $MAXSESS ];
then
if [ $(pgrep bacula | wc -l) -lt 2 ];
then
echo "show full processlist;" 2>&1 | mysql -u $MATALUSER -p$MATAPASS | mail -s "matamata $(date '+%d-%m-%Y %H:%M')" $MATAMAIL
for i in $(echo "show processlist;" | mysql -u $MATALUSER -p$MATAPASS | awk ' $2 ~ /'${LUSERDBKILL}'/ { print $1 }'); do echo "kill $i;" | mysql -u $MATALUSER -p$MATAPASS; done
fi
fi
sleep 120
done
Para que funcione el script deberemos definir adecuadamente las siguientes variables:
- MATALUSER: Necesitamos un usuario con privilegios SUPER sobre el MySQL
- MATAPASS: Contraseña del usuario del usuario SUPER del MySQL
- LUSERDBKILL: Usuario de la base de datos que queremos que controle
- MAXSESS: Sesiones que permitimos al usuario como máximo antes de considerarlas como “colgadas”
- MATAMAIL: Correo donde queremos recibir el conjunto de queries que se estan ejecutando
Como medida de precaución, antes de matar las sesiones manda un correo a la dirección indicada para que se puedan investigar las causas del problema.
Esta solución es MUY discutible, se podría argumentar que simplemente rebajando el parámetro max_user_connections podemos controlar este “bloqueo”, pero en realidad lo que estamos haciendo es eliminar threads de la base de datos que van a tardar demasiado tiempo, con que las nuevas van a poder responder a tiempo.
Personalmente creo que esto debería ser el último recurso para evitar la caída y poder pasar unos días antes de solucionar realmente el problema. En ningún caso se debería convertir en algo permanente.
Relacionados
Imprimir
Deja un comentario: