Wie kann ich MySQL-Abfragen auf meinem Linux-Server verfolgen, wenn sie auftreten?
Zum Beispiel würde ich gerne eine Art Listener einrichten, dann eine Webseite anfordern und alle Abfragen anzeigen, die die Engine ausgeführt hat, oder einfach alle Abfragen anzeigen, die auf einem Produktionsserver ausgeführt werden. Wie kann ich das machen?
mysql
monitoring
Barfoon
quelle
quelle
Antworten:
Sie können den MySQL-Befehl ausführen, um
SHOW FULL PROCESSLIST;
zu sehen, welche Abfragen zu einem bestimmten Zeitpunkt verarbeitet werden, aber das wird wahrscheinlich nicht das erreichen, was Sie sich erhoffen.Die beste Methode, um einen Verlauf abzurufen, ohne jede Anwendung über den Server ändern zu müssen, sind wahrscheinlich Trigger. Sie können Trigger so einrichten, dass jeder Abfrageauslauf dazu führt, dass die Abfrage in eine Art Verlaufstabelle eingefügt wird, und dann eine separate Seite erstellen, um auf diese Informationen zuzugreifen.
Beachten Sie jedoch, dass dies wahrscheinlich alles auf dem Server erheblich verlangsamt, indem Sie zu
INSERT
jeder einzelnen Abfrage ein zusätzliches hinzufügen .Bearbeiten: Eine andere Alternative ist das allgemeine Abfrageprotokoll. Wenn es jedoch in eine flache Datei geschrieben wird, werden viele Möglichkeiten für eine flexible Anzeige, insbesondere in Echtzeit, ausgeschlossen. Wenn Sie nur eine einfache, leicht zu implementierende Methode wünschen, um zu sehen, was los ist, reicht es aus, GQL zu aktivieren und dann die Protokolldatei auszuführen
tail -f
.quelle
Sie können jede Abfrage ganz einfach in einer Protokolldatei protokollieren:
Machen Sie Ihre Fragen (auf einer beliebigen Datenbank). Grep oder anderweitig untersuchen
/var/run/mysqld/mysqld.log
Dann vergiss es nicht
oder die Leistung sinkt und Ihre Festplatte füllt sich!
quelle
tail -f -n300 /var/run/mysqld/mysqld.log
, um Ihre Protokolldatei live zu verfolgenSELECT name FROM person where id=?
aber ich weiß nicht wasid
ist.SHOW VARIABLES
hat bei mir nicht funktioniert. Funktioniert jedochSELECT @@GLOBAL.general_log_file;
gut. (MariaDB 10.1.9)SHOW VARIABLES LIKE "log_output%"
. Wenn dies festgelegt isttable
, werden die Protokolle in der Datenbank selbst gespeichert, die Tabellemysql.general_log
nicht im Dateisystem. Sie können es ändernfile
mitSET GLOBAL log_output = 'file';
Obwohl eine Antwort bereits akzeptiert wurde, möchte ich die vielleicht einfachste Option vorstellen:
Dadurch werden die aktuellen Abfragen jede Sekunde auf Ihrem Bildschirm gedruckt.
-u
Der MySQL-Benutzer, unter dem Sie den Befehl ausführen möchten-p
Fordern Sie zur Eingabe Ihres Kennworts auf (damit Sie es nicht in einer Datei speichern müssen oder der Befehl in Ihrem Befehlsverlauf angezeigt wird).i
Das Intervall in Sekunden.--verbose
Flag, um die vollständige Prozessliste anzuzeigen und die gesamte Abfrage für jeden Prozess anzuzeigen. (Danke, nmat )Es gibt einen möglichen Nachteil: Schnelle Abfragen werden möglicherweise nicht angezeigt, wenn sie zwischen dem von Ihnen festgelegten Intervall ausgeführt werden. IE: Mein Intervall ist auf eine Sekunde festgelegt. Wenn eine Abfrage
.02
Sekunden dauert und zwischen Intervallen ausgeführt wird, wird sie nicht angezeigt.Verwenden Sie diese Option vorzugsweise, wenn Sie schnell überprüfen möchten, ob Abfragen ausgeführt werden, ohne einen Listener oder etwas anderes einrichten zu müssen.
quelle
--verbose
, um die vollständigen Abfragen zu sehenFühren Sie diese praktische SQL-Abfrage aus, um zu sehen, wie MySQL-Abfragen ausgeführt werden. Es kann von jeder beliebigen Umgebung aus ausgeführt werden, wann immer Sie möchten, ohne Codeänderungen oder Overhead. Möglicherweise ist eine Konfiguration der MySQL-Berechtigungen erforderlich, aber für mich läuft es nur ohne spezielle Einrichtung.
Der einzige Haken ist, dass Sie häufig Abfragen verpassen, die sehr schnell ausgeführt werden. Dies ist daher besonders nützlich bei länger laufenden Abfragen oder wenn der MySQL-Server Abfragen hat, die gesichert werden. Nach meiner Erfahrung ist dies genau der Zeitpunkt, an dem ich sie anzeigen möchte. " Live "Abfragen.
Sie können auch Bedingungen hinzufügen, um die SQL-Abfrage spezifischer zu gestalten.
zB Zeigt alle Abfragen an, die 5 Sekunden oder länger ausgeführt werden:
zB Alle laufenden UPDATEs anzeigen:
Ausführliche Informationen finden Sie unter: http://dev.mysql.com/doc/refman/5.1/en/processlist-table.html
quelle
Ich bin in einer bestimmten Situation, in der ich keine Berechtigungen zum Aktivieren der Anmeldung habe und keine Berechtigungen zum Anzeigen der Protokolle hätte, wenn sie aktiviert wären. Ich konnte keinen Trigger hinzufügen, hatte aber die Berechtigung, show processlist aufzurufen. Also habe ich mich nach besten Kräften bemüht und mir Folgendes ausgedacht:
Erstellen Sie ein Bash-Skript mit dem Namen "showqlprocesslist":
Führen Sie das Skript aus:
Beenden Sie die Ausgabe:
Bingo Bango. Obwohl es nicht gedrosselt ist, hat es nur 2-4% CPU auf den Boxen beansprucht, auf denen ich es ausgeführt habe. Ich hoffe vielleicht hilft das jemandem.
quelle
strace
Der schnellste Weg, um Live-MySQL / MariaDB-Abfragen zu sehen, ist die Verwendung des Debuggers. Unter Linux können Sie
strace
zum Beispiel Folgendes verwenden:Da es viele maskierte Zeichen gibt, können Sie die Ausgabe von strace durch Piping (fügen Sie einfach
|
zwischen diesen beiden Einzeilern hinzu) oben in den folgenden Befehl formatieren :Sie sollten also ziemlich saubere SQL-Abfragen ohne Zeitaufwand sehen, ohne die Konfigurationsdateien zu berühren.
Dies ersetzt natürlich nicht die unten beschriebene Standardmethode zum Aktivieren von Protokollen (bei der der SQL Server neu geladen wird).
dtrace
Verwenden Sie MySQL-Tests, um die Live-MySQL-Abfragen anzuzeigen, ohne den Server zu berühren. Beispielskript:
Speichern Sie das obige Skript in einer Datei (wie
watch.d
) und führen Sie Folgendes aus:Weitere Informationen : Erste Schritte mit DTracing MySQL
Gibbs MySQL Spyglass
Siehe diese Antwort .
Protokolle
Hier sind die Schritte, die für Entwicklungsvorschläge nützlich sind.
Fügen Sie diese Zeilen in Ihre
~/.my.cnf
oder global einmy.cnf
:Pfade:
/var/log/mysqld.log
oder/usr/local/var/log/mysqld.log
funktionieren möglicherweise auch abhängig von Ihren Dateiberechtigungen.Starten Sie dann MySQL / MariaDB neu durch (
sudo
ggf. Präfix mit ):Dann überprüfen Sie Ihre Protokolle:
Wechseln Sie nach Abschluss
general_log
zu0
(damit Sie es in Zukunft verwenden können), entfernen Sie die Datei und starten Sie den SQL Server erneut :killall -HUP mysqld
.quelle
general_log
aus einer MySQL-Abfrage festlegen . Es wird begonnen, in die Datei zu schreiben, auf die verwiesengeneral_log_file
wird.Dies ist das einfachste Setup auf einem Linux-Ubuntu-Computer, auf das ich gestoßen bin. Verrückt, alle Anfragen live zu sehen.
Suchen und öffnen Sie Ihre MySQL-Konfigurationsdatei, normalerweise /etc/mysql/my.cnf unter Ubuntu. Suchen Sie nach dem Abschnitt "Protokollierung und Replikation".
Kommentieren Sie einfach die Variable "log" aus, um die Protokollierung zu aktivieren. Starten Sie MySQL mit diesem Befehl neu:
Jetzt können Sie mit der Überwachung der eingehenden Abfragen beginnen. Öffnen Sie ein neues Terminal und führen Sie diesen Befehl aus, um durch die Protokolldatei zu scrollen und gegebenenfalls den Pfad anzupassen.
Führen Sie nun Ihre Anwendung aus. In Ihrem Terminalfenster werden die Datenbankabfragen angezeigt. (Stellen Sie sicher, dass das Scrollen und der Verlauf auf dem Terminal aktiviert sind.)
VON http://www.howtogeek.com/howto/database/monitor-all-sql-queries-in-mysql/
quelle
Über eine Befehlszeile können Sie Folgendes ausführen:
Ersetzen Sie die Werte [x] durch Ihre Werte.
Oder noch besser:
quelle
Schauen Sie sich mtop an .
quelle
mtop (MySQL top) monitors a MySQL server showing the queries which are taking the most amount of time to complete.
mtop.sourceforge.net Es ist manchmal sehr nützlich.Ich habe versucht, dasselbe zu tun, und habe eine Lösung aus verschiedenen Beiträgen zusammengeschustert und eine kleine Konsolen-App erstellt, um den Live-Abfragetext auszugeben, während er in die Protokolldatei geschrieben wird. Dies war in meinem Fall wichtig, da ich Entity Framework mit MySQL verwende und in der Lage sein muss, das generierte SQL zu überprüfen.
Schritte zum Erstellen der Protokolldatei (einige Duplikate anderer Beiträge, der Einfachheit halber hier):
Bearbeiten Sie die Datei unter:
Fügen Sie "log = development.log" am Ende der Datei hinzu. (Beachten Sie, dass ich zum Speichern dieser Datei meinen Texteditor als Administrator ausführen musste.)
Verwenden Sie die MySQL-Workbench, um eine Befehlszeile zu öffnen, und geben Sie das Kennwort ein.
Führen Sie die folgenden Schritte aus, um die allgemeine Protokollierung zu aktivieren, mit der alle ausgeführten Abfragen aufgezeichnet werden:
Dadurch werden laufende Abfragen an der folgenden Stelle in eine Textdatei geschrieben.
Erstellen / Ausführen einer Konsolen-App, die die Protokollinformationen in Echtzeit ausgibt:
Quelle hier zum Download verfügbar
Quelle:
quelle
Zusätzlich zu früheren Antworten, in denen beschrieben wurde, wie die allgemeine Protokollierung aktiviert wird, musste ich eine zusätzliche Variable in meiner Vanilla MySql 5.6-Installation ändern, bevor SQL in das Protokoll geschrieben wurde:
Die Standardeinstellung war 'NONE'.
quelle
Gibbs MySQL Spyglass
AgilData hat kürzlich den Gibbs MySQL Scalability Advisor (ein kostenloses Self-Service-Tool) veröffentlicht, mit dem Benutzer einen Live-Stream von Abfragen erfassen können, die auf Gibbs hochgeladen werden sollen. Fernglas (Open Source) überwacht die Interaktionen zwischen Ihren MySQL-Servern und Clientanwendungen. Es ist keine Neukonfiguration oder kein Neustart des MySQL-Datenbankservers erforderlich (weder Client noch App).
GitHub: AgilData / gibbs-mysql-spyglass
Erfahren Sie mehr: Informationen Packet Capturing MySQL mit Rust
Installationsbefehl:
quelle