nov 27

Limiter le temps d’exécution d’une requête MySQL

Vous est-il déjà arrivé de voir un de vos serveurs de base de données MySQL mis à genoux par la faute de développeurs incompétents qui effectuent des requêtes sur des tables sans index composées de dizaines de millions de tuples ?
Si la réponse est oui, voici ma solution « one line » pour les calmer un peu ! :)

Logiciels utilisés :

  • GNU Awk 3.1.5
  • MySQL Client 5.0.51a
root@gnusquad:~# mysql -e 'SHOW PROCESSLIST' | awk 'BEGIN { MAX_TIME = 60 ; USERS = "boulet1|boulet2" } $6 > MAX_TIME && $5 == "Query" && $2 ~ USERS {print "KILL " $1 ";"}' | mysql

Petites explications sur le code « awk » :

  • $1 contient l’ID de la requête SQL
  • $2 contient le nom de l’utilisateur
  • $5 contient le type de commande (Query, Sleep, …)
  • $6 contient le temps d’exécution de la requête SQL en secondes
  • MAX_TIME contient le temps en secondes à partir duquel une requête doit être tuée
  • USERS contient une expression rationnelle indiquant les utilisateurs concernés par cette sanction

Il ne vous reste plus qu’à mettre ce script dans le « crontab » en pensant à vous connecter avec un utilisateur MySQL ayant le droit « SUPER » pour pouvoir tuer les connexions si besoin est. :)

À lire :

Laissez un commentaire