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).
echo show full processlist | mysql
oder besserSELECT 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 beiinnotop
oderpt-kill
Antworten:
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.
quelle
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.
quelle
Versuchen Sie diesen Befehl als root (oder verwenden Sie
sudo
):Gefunden http://www.mysqlperformanceblog.com/2008/11/07/poor-mans-query-logging/
quelle
Sicher:
Prost
quelle
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.
quelle
Das terminalbasierte Wireshark-Programm tshark kann helfen:
sudo yum install wireshark
gibt dir tshark auf Amazon Linux undsudo apt-get install tshark
gibt dir tshark auf Ubuntu 14+quelle
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 ...
quelle
Erfassen Sie MySQL-TCP-Sitzungen mit tcpdump, sowohl bei Abfragen als auch bei Antworten. Sie können einen Dump beispielsweise mit Maatkit-Tools analysieren:
http://www.maatkit.org/doc/mk-tcp-model.html
http://www.maatkit.org/doc/mk-query-digest.html
quelle
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.
quelle