Wie werden die auf dem MySQL-Server ausgeführten Abfragen erfasst?

14

Wir versuchen, einige Fehler in der Serverleistung zu beheben, und ich möchte eine Momentaufnahme der Abfragen machen, die auf unserem MySQL-Server über einen Zeitraum von ein paar Minuten ausgeführt werden.

Ich bin mit MySQL vertraut SHOW FULL PROCESSLIST, möchte dies jedoch über die Befehlszeile ausführen können, damit ich es in eine Datei kopieren und nachbearbeiten kann.

Gibt es eine Möglichkeit, diese Abfrage in eine Datei auszugeben und sie etwa jede Sekunde ausführen zu lassen?

Gibt es eine bessere Möglichkeit, alle ausgeführten Abfragen zu erfassen?

Beachten Sie, dass ich nicht nur an langsamen Abfragen interessiert bin (ich kenne das Protokoll für langsame Abfragen).

Hafichuk
quelle
Welches Betriebssystem verwenden Sie? Dies ist extrem einfach unter Linux zu tun, also rate ich Windows?
Patrick
@Patrick Freut mich zu hören, dass es unter Linux einfach ist! Feuer weg ...
Hafichuk
1
Die meisten Abfragen werden in weniger als einer Sekunde ausgeführt und abgeschlossen und nie in Ihrer Liste angezeigt.
Joel Coel
Zusätzlich werden längere Abfragen mehrmals für jede Schleife angezeigt. Wenn Sie möchten, können Sie jedoch auch einfach echo show full processlist | mysqloder besser SELECT info FROM information_schema.processlist WHERE Command="Query" AND User!="root"in einer Schleife in Bash vorgehen. Wenn Sie ein paar Zeilen hinzufügen, erhalten Sie dieselbe Abfragefunktion wie bei innotopoder pt-kill
theist.

Antworten:

10

Ich würde das langsame Abfrageprotokoll verwenden. Es erfasst alle Abfragen, nicht nur die langsamen, wenn Sie long_query_time = 0 setzen.

Es werden auch ALLE Abfragen erfasst, was für die hier erwähnten TCP-Sniffing-Techniken nicht zutrifft. Diese erfassen keine Abfragen, die über einen Socket ausgeführt werden. Das Gleiche gilt für SHOW PROCESSLIST; Sie werden schnell laufende Abfragen vermissen.

Wenn Sie Abfragen über die Prozessliste oder über TCP-Verkehr erfassen möchten, empfehle ich die Verwendung von Percona Toolkits pt-query-digest. Es kann die Prozessliste für Sie abfragen (und aus den Ergebnissen einen Sinn machen, was sehr schwierig ist, wenn Sie eine Reihe von Beispielen selbst erfassen), und es kann das TCP-Protokoll von MySQL interpretieren, sodass Sie sich TCP holen können Verkehr und analysieren Sie es. Natürlich ist es auch der beste Query Aggregator / Profiler / Reporter, der jemals geschrieben wurde, aber Sie haben nicht gesagt, was Sie mit den Abfragen tun möchten, nachdem Sie sie erfasst haben.

Baron Schwartz
quelle
13

Die robusteste Methode ist die Verwendung des "allgemeinen Abfrageprotokolls", in dem alle Abfragen erfasst werden: http://dev.mysql.com/doc/refman/5.1/de/query-log.html

Sie geben nicht die MySQL-Serverversion an, aber wenn Sie 5.1.12 oder höher haben, können Sie dies mit einer globalen Variablen über SQL aktivieren und deaktivieren. Einzelheiten finden Sie in der Dokumentation.

Daniel Pittman
quelle
Vielen Dank an Daniel. Wir haben dies aktiviert, es sind jedoch keine Zeitstempelinformationen im Protokoll enthalten. Irgendeine Idee, wie man einen Zeitstempel dort hinein bekommt?
Hafichuk
Entschuldigung, nein, nichts anderes als Sie auf das Handbuch zu verweisen.
Daniel Pittman
2
Das langsame Abfrageprotokoll mit long_query_time = 0 ist eine bessere Option. Es werden weiterhin alle Abfragen erfasst.
Baron Schwartz
+1 für den Baron: Das allgemeine Abfrageprotokoll enthält nicht die Leistungsmessdaten, die Sie benötigen. Es gibt auch Perl-Skripte, die mit MySQL Server zur Analyse des langsamen Abfrageprotokolls gebündelt sind (wodurch Literalwerte aus Prädikaten entfernt werden). Beachten Sie jedoch, dass ältere Versionen von MySQL eine long_query_time von weniger als 1 Sekunde nicht unterstützen. Wenn dies für Sie der Fall ist, dann führen Sie ein Upgrade durch. In neueren Versionen wurde die Leistung erheblich verbessert.
Symcbean
5

Versuchen Sie diesen Befehl als root (oder verwenden Sie 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.=" $_";
  }
}'

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

Rui Pedro Bernardino
quelle
4

Sicher:

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

Prost

HTTP500
quelle
Ah ... Mysqladmin. Perfekt, danke @ HTTP500
Hafichuk
1
Dadurch wird der Befehl processlist tatsächlich alle 1 Sekunde ausgeführt. Einige sehr schnelle Abfragen können sich immer noch der Erfassung entziehen. Wenn das Laden aus wenigen großen Abfragen besteht, funktioniert es, wenn es aus vielen kleinen Abfragen besteht, funktioniert es möglicherweise nicht.
LSerni
@Isemi, das OP bat um "jede Sekunde oder so".
HTTP500
3

Dies könnte ein Ort für den MySQL-Proxy sein . Grundsätzlich können Sie die gesendeten Abfragen erfassen (und bearbeiten). Ein grundlegendes Setup zum Abfangen ist ziemlich einfach. Ändern Sie dann einfach Ihre Client-Konfiguration so, dass sie auf den Proxy zeigt, damit Sie alle Anforderungen erfassen können.

Zoredache
quelle
3

Das terminalbasierte Wireshark-Programm tshark kann helfen:

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

sudo yum install wiresharkgibt dir tshark auf Amazon Linux und sudo apt-get install tsharkgibt dir tshark auf Ubuntu 14+

SoMoSparky
quelle
2

Ich habe 'Rui Pedro Bernardinos Lösung verwendet. Funktioniert hervorragend, außer ich habe ein paar Dinge in der ersten Zeile geändert, wie unten beschrieben ...

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
quelle
0

Ich suchte und suchte und landete schließlich bei MONyog, um alle Abfragen in Echtzeit zu überwachen, die auf dem MySQL-Server ausgeführt werden. Das einzige, was zu beachten ist, ist, dass die Tabellen "Performance_schema" und "statements_digest" aktiviert und "Performance_schema" aktiviert sind verfügbar mit MySQL 5.6.14 und höher.

Mathew
quelle