Comment capturer les requêtes exécutées sur le serveur MySQL?

14

Nous essayons de faire un débogage des performances du serveur et je voudrais capturer un instantané des requêtes en cours d'exécution sur notre serveur MySQL sur une période de quelques minutes.

Je connais MySQL SHOW FULL PROCESSLIST, mais j'aimerais pouvoir l'exécuter via la ligne de commande afin de pouvoir le vider dans un fichier et le post-traiter.

Existe-t-il un moyen de générer cette requête dans un fichier et de l'exécuter toutes les secondes environ?

Existe-t-il un meilleur moyen de capturer toutes les requêtes en cours d'exécution?

Notez que je ne m'intéresse pas uniquement aux requêtes lentes (je connais bien le journal des requêtes lentes).

hafichuk
la source
Quel système d'exploitation utilisez-vous? C'est extrêmement facile à faire sur Linux, donc je suppose que Windows?
Patrick
@Patrick Heureux d'entendre que c'est facile sur Linux! Feu loin ...
hafichuk
1
La plupart des requêtes s'exécutent et se terminent en moins d'une seconde et n'apparaissent jamais sur votre liste.
Joel Coel
en outre, les requêtes plus longues apparaîtront plusieurs fois une fois pour chaque boucle, mais bien sûr, si vous le souhaitez, vous pouvez simplement echo show full processlist | mysqlou mieux SELECT info FROM information_schema.processlist WHERE Command="Query" AND User!="root"dans une boucle dans bash. Ajoutez quelques lignes et vous obtiendrez la même fonctionnalité de requête que innotopou pt-kill
theist

Réponses:

10

J'utiliserais le journal des requêtes lentes. Il capture toutes les requêtes, pas seulement celles qui sont lentes, si vous définissez long_query_time = 0.

Il capture également TOUTES les requêtes, ce qui n'est pas le cas des techniques de détection de TCP mentionnées ici; ceux-ci ne captureront pas les requêtes exécutées via un socket. Idem pour regarder SHOW PROCESSLIST; vous manquerez des requêtes rapides.

Si vous souhaitez capturer des requêtes via la liste de processus ou via le trafic TCP, je vous suggère d'utiliser pt-query-digest de Percona Toolkit. Il peut interroger la liste de processus pour vous (et donner un sens aux résultats, ce qui est très difficile à faire si vous en capturez vous-même un certain nombre d'échantillons), et il peut interpréter le protocole TCP de MySQL, vous pouvez donc saisir du TCP trafic et l'analyser. Bien sûr, c'est aussi le meilleur agrégateur / profileur / reporter de requêtes jamais écrit, mais vous n'avez pas dit ce que vous vouliez faire avec les requêtes après les avoir capturées.

Baron Schwartz
la source
13

Le moyen le plus robuste serait d'utiliser le "journal général des requêtes", qui capturera toutes les requêtes: http://dev.mysql.com/doc/refman/5.1/en/query-log.html

Vous ne spécifiez pas la version du serveur MySQL, mais si vous disposez de la version 5.1.12 ou ultérieure, vous pouvez l'activer et la désactiver avec une variable globale via SQL; voir la documentation pour plus de détails.

Daniel Pittman
la source
Merci @Daniel. Nous l'avons activé, mais il n'y a aucune information d'horodatage dans le journal. Avez-vous une idée de la façon d'obtenir un horodatage?
hafichuk
Désolé, non, rien d'autre que de vous indiquer le manuel.
Daniel Pittman
2
Le journal des requêtes lentes avec long_query_time = 0 est une meilleure option; il capturera toujours toutes les requêtes.
Baron Schwartz
+1 pour le baron: le journal général des requêtes n'inclut pas les mesures de performances dont vous avez besoin. Il existe également des scripts Perl fournis avec le serveur MySQL pour analyser le journal des requêtes lentes (qui supprime les valeurs littérales des prédicats). Mais notez que les anciennes versions de MySQL ne prendront pas en charge un long_query_time de moins de 1 seconde - si c'est le cas pour vous, alors mettez à niveau - il y a beaucoup plus d'améliorations de performances dans les versions récentes.
symcbean
5

Essayez cette commande en tant que root (ou utilisez sudo):

tcpdump -i eth0 -s 0 -l -w - dst port 3306 | strings | perl -e '
while(<>) { chomp; next if /^[^ ]+[ ]*$/;
  if(/^(SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER)/i) {
    if (defined $q) { print "$q\n"; }
    $q=$_;
  } else {
    $_ =~ s/^[ \t]+//; $q.=" $_";
  }
}'

Trouvé http://www.mysqlperformanceblog.com/2008/11/07/poor-mans-query-logging/

Rui Pedro Bernardino
la source
4

Sûr:

mysqladmin -u root -p -i 1 --verbose processlist > /tmp/pl.out

À votre santé

HTTP500
la source
Ah ... mysqladmin. Parfait, merci @ HTTP500
hafichuk
1
Cela exécute en fait la commande processlist toutes les 1 seconde. Certaines requêtes très rapides peuvent encore échapper à la capture; si la charge est composée de quelques grandes requêtes, cela fonctionnera, si elle est composée de nombreuses petites requêtes, cela pourrait ne pas fonctionner.
LSerni
@Isemi, le PO a demandé "toutes les secondes environ".
HTTP500
4

Cela pourrait être un endroit pour le proxy Mysql . Il vous permet essentiellement de capturer (et de manipuler) les requêtes envoyées. Une configuration de base pour intercepter est assez simple. Ensuite, modifiez simplement la configuration de votre client pour pointer vers le proxy afin de pouvoir capturer toutes les demandes.

Zoredache
la source
4

Le programme basé sur terminal Wireshark tshark peut aider:

tshark -T fields -R mysql.query -e mysql.query

sudo yum install wiresharkvous donnera tshark sur Amazon Linux et sudo apt-get install tsharkvous donnera tshark sur Ubuntu 14+

SoMoSparky
la source
3

J'ai utilisé la solution de 'Rui Pedro Bernardino. Fonctionne très bien sauf que j'ai changé quelques choses dans la première ligne comme détaillé ci-dessous ...

tcpdump -i any -s 0 -l -vvv -w - dst port 3306 | strings | perl -e 'while(<>) { chomp; next if /^[^ ]+[ ]*$/;
    if(/^(SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER)/i) {
    if (defined $q) { print "$q\n"; }
    $q=$_;
  } else {
    $_ =~ s/^[ \t]+//; $q.=" $_";
  }
}'
user1038090
la source
0

Je cherchais et cherchais et finalement j'ai atterri à MONyog pour surveiller toutes les requêtes en temps réel qui sont exécutées sur le serveur mysql. La seule chose à noter est la table "Performance_schema" et "déclarations_digest" doit être activée et Performance_schema est disponible avec MySQL 5.6.14 et supérieur.

Mathew
la source