Wie zeige ich die letzten auf MySQL ausgeführten Abfragen an?

471

Gibt es eine Abfrage / Möglichkeit, die zuletzt auf ALLEN Servern ausgeführten Abfragen anzuzeigen ?

FerranB
quelle

Antworten:

793

Für diejenigen, die mit MySQL> = 5.1.12 gesegnet sind, können Sie diese Option zur Laufzeit global steuern:

  1. Ausführen SET GLOBAL log_output = 'TABLE';
  2. Ausführen SET GLOBAL general_log = 'ON';
  3. Schauen Sie sich den Tisch an mysql.general_log

Wenn Sie lieber in eine Datei als in eine Tabelle ausgeben möchten:

  1. SET GLOBAL log_output = "FILE"; die Standardeinstellung .
  2. SET GLOBAL general_log_file = "/path/to/your/logfile.log";
  3. SET GLOBAL general_log = 'ON';

Ich bevorzuge diese Methode gegenüber der Bearbeitung von .cnf-Dateien, weil:

  1. Sie bearbeiten die my.cnfDatei nicht und aktivieren möglicherweise die Protokollierung dauerhaft
  2. Sie fischen nicht im Dateisystem herum und suchen nach dem Abfrageprotokoll - oder noch schlimmer, abgelenkt von der Notwendigkeit des perfekten Ziels. /var/log /var/data/log /opt /home/mysql_savior/var
  3. Sie müssen den Server nicht neu starten und keine aktuellen Verbindungen zu ihm unterbrechen.
  4. Wenn Sie den Server neu starten, bleiben Sie dort, wo Sie begonnen haben (das Protokoll ist standardmäßig noch deaktiviert).

Weitere Informationen finden Sie im MySQL 5.1-Referenzhandbuch - Serversystemvariablen - general_log

FlipMcF
quelle
4
Tolles UI-Design. Wie auch immer, MySQL-Protokolltabellen verwenden tatsächlich die CSV-Engine, sodass Sie alles tun können, was FlipMcF in der Antwort zum Aktivieren der Anmeldung in der Tabelle general_log gesagt hat, und tail -f von general_log wie folgt haben: tail -f / var / lib / mysql / mysql / general_log.CSV
2
Verdammt, das MySQL-Dokument dafür hat nicht einmal den Tabellenparameter erschossen. Vielen Dank.
Abhishek Dujari
6
Denken Sie daran, Ihre allgemeine Protokolltabelle zu löschen, wenn Sie fertig sind: "Tabelle abschneiden mysql.general_log"
pdwalker
1
Ich habe das Ergebnis auf diese Weise erhalten, aber die Parameter werden durch ein Fragezeichen angezeigt, z. B. wählen Sie foo aus dem Balken mit x =?. Wie kann ich die vollständige Abfrage erhalten?
Okwap
43

Sie können ein allgemeines Abfrageprotokoll für diese Art von Diagnose aktivieren . Im Allgemeinen protokollieren Sie jedoch nicht alle SELECT-Abfragen auf einem Produktionsserver. Dies ist ein Leistungskiller.

Bearbeiten Sie Ihre MySQL-Konfiguration, z. B. /etc/mysql/my.cnf - suchen Sie nach einer solchen Zeile oder fügen Sie sie hinzu

[mysqld]
log = /var/log/mysql/mysql.log

Starten Sie mysql neu, um diese Änderung zu übernehmen. Jetzt können Sie

tail -f /var/log/mysql/mysql.log

Hey Presto, du kannst dir die Anfragen ansehen, wenn sie eingehen.

Paul Dixon
quelle
4
general_log_file und general_log in meiner my.cnf
Martin Thoma
Dies funktioniert, wenn Sie wissen möchten, starten Sie mysql askubuntu.com/questions/82374/how-do-i-start-stop-mysql-server
Nanhe Kumar
1
Neuere Versionen von Mac OS X (zumindest unter Mac OS X) erfordern die Optionen general_log_file und general_log anstelle von nur "log =". Andernfalls wird folgende Fehlermeldung angezeigt: ERROR / usr / local / mysql / bin / mysqld: Mehrdeutige Option '--log = / tmp / mysql_queries.log' (log-bin, log_slave_updates)
Jay Sheth
@ JaySheth, ich habe diesen Fehler in Mariadb 10.2 erhalten, daher bin ich mir nicht sicher, ob es sich nur um Mac OS handelt.
user10089632
16

Sie können das Fließende für die Überwachung von MySQL-Abfrageprotokollen tun.

Öffnen Sie die MySQL-Konfigurationsdatei my.cnf

sudo nano /etc/mysql/my.cnf

Suchen Sie die folgenden Zeilen unter einer [mysqld]Überschrift und kommentieren Sie diese Zeilen aus, um das Protokoll zu aktivieren

general_log_file        = /var/log/mysql/mysql.log
general_log             = 1

Starten Sie Ihren MySQL-Server neu, um Änderungen zu berücksichtigen

sudo service mysql start

Überwachen Sie das MySQL-Serverprotokoll mit dem folgenden Befehl im Terminal

tail -f /var/log/mysql/mysql.log
Rokibul Hasan
quelle
15
SELECT * FROM  mysql.general_log  WHERE command_type ='Query' LIMIT total;
zloctb
quelle
9

1) Wenn die allgemeine MySQL-Protokollierung aktiviert ist, können wir die Abfragen in der Protokolldatei oder -tabelle anhand der Angaben in der Konfiguration überprüfen. Überprüfen Sie mit dem folgenden Befehl, was aktiviert ist

mysql> show variables like 'general_log%';
mysql> show variables like 'log_output%';

Wenn wir einen Abfrageverlauf in der Tabelle benötigen, dann

Execute SET GLOBAL log_output = 'TABLE';
Execute SET GLOBAL general_log = 'ON';

Schauen Sie sich die Tabelle mysql.general_log an

Wenn Sie lieber in eine Datei ausgeben möchten:

SET GLOBAL log_output = "FILE"; which is set by default.
SET GLOBAL general_log_file = "/path/to/your/logfile.log";
SET GLOBAL general_log = 'ON';

2) Wir können auch die Abfragen in der .mysql_history-Datei cat ~ / .mysql_history überprüfen

minhas23
quelle
4

Vielleicht können Sie das herausfinden, indem Sie sich das Abfrageprotokoll ansehen .

Cherouvim
quelle
4

Wenn mysql binlog aktiviert ist, können Sie die vom Benutzer ausgeführten Befehle überprüfen, indem Sie den folgenden Befehl in der Linux-Konsole ausführen, indem Sie zum mysql binlog-Verzeichnis navigieren

mysqlbinlog binlog.000001 >  /tmp/statements.sql

aktivieren

[mysqld]
log = /var/log/mysql/mysql.log

oder ein allgemeines Protokoll wirkt sich auf die Leistung von MySQL aus

Avinash Singh
quelle
möglich, aber schmerzhaft. Nützlicher, wenn Sie sehen möchten, was in der Vergangenheit passiert ist.
pdwalker
2

Wenn Sie keine Lust haben, Ihre MySQL-Konfiguration zu ändern, können Sie einen SQL-Profiler wie "Neor Profile SQL" http://www.profilesql.com verwenden .

Bitclaw
quelle
2

Nachdem ich Pauls Antwort gelesen hatte, suchte ich unter https://dev.mysql.com/doc/refman/5.7/en/query-log.html nach weiteren Informationen

Ich habe einen wirklich nützlichen Code von einer Person gefunden. Hier ist die Zusammenfassung des Kontexts.

(Hinweis: Der folgende Code gehört nicht mir.)

Dieses Skript ist ein Beispiel, um die Tabelle sauber zu halten, damit Sie Ihre Tabellengröße reduzieren können. Wie nach einem Tag wird es ungefähr 180.000 Protokollabfragen geben. (In einer Datei wären es 30 MB pro Tag)

Sie müssen eine zusätzliche Spalte (event_unix) hinzufügen, und dann können Sie dieses Skript verwenden, um das Protokoll sauber zu halten. Es aktualisiert den Zeitstempel in einen Unix-Zeitstempel, löscht die Protokolle, die älter als 1 Tag sind, und aktualisiert dann die Ereigniszeit in Timestamp von event_unix ... klingt etwas verwirrend, funktioniert aber großartig.

Befehle für die neue Spalte:

SET GLOBAL general_log = 'OFF';
RENAME TABLE general_log TO general_log_temp;
ALTER TABLE `general_log_temp`
ADD COLUMN `event_unix` int(10) NOT NULL AFTER `event_time`;
RENAME TABLE general_log_temp TO general_log;
SET GLOBAL general_log = 'ON';

Bereinigungsskript:

SET GLOBAL general_log = 'OFF';
RENAME TABLE general_log TO general_log_temp;
UPDATE general_log_temp SET event_unix = UNIX_TIMESTAMP(event_time);
DELETE FROM `general_log_temp` WHERE `event_unix` < UNIX_TIMESTAMP(NOW()) - 86400;
UPDATE general_log_temp SET event_time = FROM_UNIXTIME(event_unix);
RENAME TABLE general_log_temp TO general_log;
SET GLOBAL general_log = 'ON';

Der Kredit geht an Sebastian Kaiser (Originalautor des Codes).

Hoffe, jemand wird es nützlich finden, wie ich es getan habe.

Dev Aggarwal
quelle
Interessant. Sie würden Abfragen während der Bereinigung verpassen, wenn Sie nicht zuerst alle Datenbanken gesperrt haben. Hier können andere Probleme auftreten. Wenn wir uns an diesem Punkt der "kontinuierlichen" Protokollierung befinden, würde ich die Dateiprotokollierung oder das Bin-Protokoll und einen Standard-Protokollrotator verwenden.
FlipMcF
1

Sie können sich unter Linux Folgendes ansehen

cd /root

ls -al

vi .mysql_history Es kann helfen

Avinash Singh
quelle
6
Dies sieht so aus, als würde es nur für den offiziellen Befehlszeilen-MySQL-Client funktionieren und nur für Abfragen, die vom Root-Benutzer ausgeführt werden
Golimar
Die Frage lautet "Der gesamte Server", wodurch diese Antwort falsch ist. Dies würde alle Abfragen anzeigen, die von einem einzelnen Client ausgeführt werden.
FlipMcF
Wenn mysql binlog aktiviert ist, können Sie die vom Benutzer ausgeführten Befehle überprüfen, indem Sie den folgenden Befehl in der Linux-Konsole ausführen, indem Sie zum mysql binlog-Verzeichnis mysqlbinlog binlog.000001> /tmp/statements.sql navigieren und [mysqld] log = / var / log / mysql / aktivieren mysql.log oder genral log wird sich auf die Leistung von mysql auswirken
Avinash Singh
Einige Einträge in diesem Bereich werden ohnehin standardmäßig unterdrückt, z. B. Zeichenfolgen, die "Kennwort" enthalten.
McKenzm