Le Blog de C-quad

Archive pour octobre 2011

Mysql – Voir les requêtes qui ont été executées par le serveur

Cet article est parmi les plus court que j’ai eu l’occasion d’écrire car il a surtout vocation à me servir de pense bête pour m’éviter de faire deux fois la même recherche.

Le contexte :

Suite à des incidents sur un traitement qui génère dynamiquement une requête SQL et dont le contenu n’est pas logué entièrement dans les logs applicatives, il m’était nécessaire de récupérer les instructions SQL exécutées par le serveur.

Méthode par fichier de log des requêtes

Il existe bien une méthode qui permet d’alimenter un fichier avec l’ensemble des requêtes en modifiant la configuration my.cnf pour ceux que cela intéresse plus particulièrement :  cf le support Mysql sur cette fonctionnalité

Cette méthode utilisant un fichier a malgré tout quelques inconvénients notables :

  • Le fichier contenant les requêtes peut devenir très rapidement énorme et compromettre la stabilité du serveur (filesystem full etc)
  • Il est nécessaire de redémarrer mysqld pour que la modification de paramétrage soit prise en compte

Méthode par alimentation de tables de logs

Depuis Mysql 5.1, il est possible plutôt que d’alimenter un fichier de log d’alimenter une table, ainsi que d’activer et désactiver cette fonctionnalité sans avoir à redémarrer le serveur.

C’est cette fonctionnalité que j’ai choisi d’utiliser. Il faut néanmoins pour pouvoir l’utiliser avoir accès au schéma « mysql ».

Il suffit dans une console mysql de lancer les commandes suivantes (avec un compte disposant de suffisamment de privilèges ;-)):

SET GLOBAL general_log = 'ON';
SET GLOBAL log_output = 'TABLE';

Ces deux commandes vont respectivement :

  • Activer les logs générales
  • Envoyer ces logs dans la table « mysql.general_log » plutôt que dans un fichier

Vous retrouverez ensuite l’ensemble des requêtes exécutées dans la table  mysql.general_log.

Pour désactiver il suffira de remettre à off le paramètre :

SET GLOBAL general_log = 'OFF';

Voila en espérant que cela permette de dépanner d’autres personnes que moi 🙂