604 votes

Comment puis-je visualiser les requêtes MySQL en direct ?

Comment puis-je suivre les requêtes MySQL sur mon serveur Linux au fur et à mesure qu'elles se produisent ?

Par exemple, j'aimerais mettre en place une sorte d'écouteur, puis demander une page Web et voir toutes les requêtes que le moteur a exécutées, ou simplement voir toutes les requêtes exécutées sur un serveur de production. Comment puis-je faire cela ?

0 votes

En fonction de la gravité du problème, je recommanderais vivement d'essayer MySql Proxy. Parce qu'il peut être placé sur le serveur d'application, a) il est évolutif, b) il n'a pas besoin d'affecter tout le trafic vers la base de données. Il est en "alpha", mais il existe depuis longtemps. dev.mysql.com/downloads/mysql-proxy

1 votes

J'ai reformulé cette question afin d'omettre toute référence aux outils. Je pense que cette question est tout à fait pertinente ici, car "exécutons-nous les requêtes que nous devrions exécuter ?" est une excellente première étape dans le débogage d'un problème lié à une base de données.

1 votes

Le proxy mysql @MaasSql n'est pas utile pour les développeurs php lorsqu'ils utilisent PDO car la requête et les valeurs ne sont liées qu'au serveur.

627voto

artfulrobot Points 3283

Vous pouvez enregistrer chaque requête dans un fichier journal très facilement :

mysql> SHOW VARIABLES LIKE "general_log%";

+------------------+----------------------------+
| Variable_name    | Value                      |
+------------------+----------------------------+
| general_log      | OFF                        |
| general_log_file | /var/run/mysqld/mysqld.log |
+------------------+----------------------------+

mysql> SET GLOBAL general_log = 'ON';

Faites vos requêtes (sur n'importe quelle base de données). Grep ou autre examen /var/run/mysqld/mysqld.log

Alors n'oubliez pas de

mysql> SET GLOBAL general_log = 'OFF';

ou les performances vont s'effondrer et votre disque va se remplir !

49 votes

Bonne réponse ! Vous pouvez utiliser tail -f -n300 /var/run/mysqld/mysqld.log pour garder une trace vivante de votre fichier journal

5 votes

Notez que MySQL 5.1.12 ou plus est nécessaire pour ces variables. Avant cela, vous devrez redémarrer MySQL pour modifier ces paramètres.

0 votes

Existe-t-il un moyen d'obtenir que les variables paramétrées soient écrites dans le journal ? Je vois SELECT name FROM person where id=? mais je ne sais pas ce que id est.

370voto

Chad Birch Points 39087

Vous pouvez exécuter la commande MySQL SHOW FULL PROCESSLIST; pour voir quelles requêtes sont en cours de traitement à un moment donné, mais cela ne vous permettra probablement pas d'obtenir ce que vous espérez.

La meilleure méthode pour obtenir un historique sans avoir à modifier chaque application utilisant le serveur est probablement les triggers. Vous pourriez configurer des déclencheurs de sorte que chaque requête exécutée entraîne l'insertion de la requête dans une sorte de tableau d'historique, puis créer une page distincte pour accéder à ces informations.

Sachez que cela va probablement ralentir considérablement tout ce qui se trouve sur le serveur, car l'ajout d'un module supplémentaire INSERT en plus de chaque requête.


Edit : une autre alternative est le Journal des requêtes générales mais le fait de l'écrire dans un fichier plat supprimerait beaucoup de possibilités de flexibilité d'affichage, notamment en temps réel. Si vous souhaitez simplement un moyen simple et facile à mettre en œuvre pour voir ce qui se passe, vous pouvez activer le GQL et utiliser l'exécution de la commande tail -f sur le fichier journal ferait l'affaire.

6 votes

Cela peut paraître idiot mais comment puis-je activer le GQL ? J'ai ajouté log_output=file, general_log=1, et general_log_file=/pathtofile, et j'ai coupé le fichier journal, j'ai visité le site et je n'ai rien obtenu. Qu'est-ce que je fais de mal ?

0 votes

Je ne peux pas être sûr de quoi que ce soit, mais assurez-vous que vous avez redémarré le serveur, et aussi que le fichier que vous avez choisi est un fichier auquel mysql a accès en écriture.

0 votes

Chad - le fichier/répertoire est accessible par l'utilisateur mysql, et j'ai redémarré le serveur plusieurs fois. Toujours rien. D'autres idées ?

266voto

Bob Kruithof Points 1030

Même si une réponse a déjà été acceptée, je voudrais présenter ce qui pourrait même être l'option la plus simple :

$ mysqladmin -u bob -p -i 1 processlist

Cela imprimera les requêtes actuelles sur votre écran toutes les secondes.

  • -u L'utilisateur mysql sous lequel vous voulez exécuter la commande
  • -p Demander votre mot de passe (pour ne pas avoir à l'enregistrer dans un fichier ou à faire apparaître la commande dans l'historique des commandes).
  • i L'intervalle en secondes.
  • Utilisez le --verbose pour afficher la liste complète des processus, en affichant la requête complète pour chaque processus. (Merci, nmat )

Il y a un inconvénient possible : les requêtes rapides peuvent ne pas apparaître si elles sont exécutées entre les intervalles que vous avez définis. IE : Mon intervalle est fixé à une seconde et s'il y a une requête qui prend .02 secondes à courir et est exécuté entre les intervalles, vous ne le verrez pas.

Utilisez cette option de préférence lorsque vous souhaitez vérifier rapidement les requêtes en cours sans avoir à configurer un listener ou autre.

24 votes

C'est la meilleure solution !

4 votes

A mon avis, cette solution est meilleure car elle n'utilise pas une nouvelle connexion mysql pour envoyer la commande à chaque fois, mais ouvre une connexion mysql et l'utilise pour envoyer la show processlist ;

0 votes

@JoseNobile Si vous gardez la connexion mysql ouverte dans votre adaptateur, cela n'a pas vraiment d'importance. Ma solution ne convient pas exactement à OP parce que ma solution n'est pas prête à être utilisée dans un adaptateur. Cependant, elle est rapide et facile.

19voto

Michael Krauklis Points 2145

Je suis dans une situation particulière où je n'ai pas les autorisations nécessaires pour activer la journalisation, et je n'aurais pas les autorisations nécessaires pour voir les journaux s'ils étaient activés. Je n'ai pas pu ajouter de déclencheur, mais j'ai les permissions d'appeler show processlist. Alors, j'ai fait de mon mieux et j'ai trouvé ceci :

Créez un bash script appelé "showsqlprocesslist" :

#!/bin/bash

while [ 1 -le 1 ]
do
         mysql --port=**** --protocol=tcp --password=**** --user=**** --host=**** -e "show processlist\G" | grep Info | grep -v processlist | grep -v "Info: NULL";
done

Exécuter le script :

./showsqlprocesslist > showsqlprocesslist.out &

Terminer la sortie :

tail -f showsqlprocesslist.out

Bingo bango. Même s'il n'est pas bridé, il n'a occupé que 2 à 4 % de l'unité centrale sur les ordinateurs sur lesquels je l'ai utilisé. J'espère que cela pourra aider quelqu'un.

0 votes

Ha ! Délicieux. J'adore ça.

0 votes

Il faut un certain délai pour éviter une sortie trop verbeuse. Voir ma modification s'il vous plaît.

0 votes

@Slyx merci pour la suggestion de mettre un sommeil dans la boucle. Cependant, si vous recherchez des requêtes de courte durée, c'est-à-dire moins longtemps que la période de sommeil, vous risquez de ne pas trouver ce que vous cherchez. Si vous ne cherchez vraiment qu'un instantané dans le temps, il ne faut pas l'exécuter en boucle. Il convient également de noter que cette méthode peut toujours manquer des requêtes de très courte durée.

13voto

Chris KL Points 2418

Vérifiez mtop .

1 votes

Oui, mais bonne chance pour l'installer sur Debian ou Ubuntu : bugs.launchpad.net/ubuntu/+source/mtop/+bug/77980

0 votes

J'ai réussi à le faire fonctionner sur Debian, mais il ne sert à rien car il manque beaucoup de requêtes. Je peux voir le compteur de requêtes qui augmente constamment mais il affiche rarement les requêtes. On dirait qu'il n'affiche que les requêtes qui prennent plus d'une seconde environ.

0 votes

@Cobra_Fast clairement indiqué sur la page Sourceforge de mtop : mtop (MySQL top) monitors a MySQL server showing the queries which are taking the most amount of time to complete. mtop.sourceforge.net C'est assez utile parfois.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X