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 :
