Wie aktiviere ich MySQL Query Log?

252

Wie aktiviere ich die MySQL-Funktion, die jede von Clients empfangene SQL-Abfrageanweisung und die Zeit protokolliert, die diese Abfrageanweisung gesendet hat? Kann ich das in phpmyadmin oder NaviCat machen? Wie analysiere ich das Protokoll?

Feng-Chun Ting
quelle

Antworten:

301

Zuerst Denken Sie daran , dass diese Protokolldatei sehr groß auf einem ausgelasteten Server wachsen kann.

Für MySQL <5.1.29:

Fügen Sie dies /etc/my.cnfin den [mysqld]Abschnitt ein, um das Abfrageprotokoll zu aktivieren

log   = /path/to/query.log  #works for mysql < 5.1.29

Auch um es über die MySQL-Konsole zu aktivieren

SET general_log = 1;

Siehe http://dev.mysql.com/doc/refman/5.1/en/query-log.html

Für MySQL 5.1.29+

Mit MySQL 5.1.29+ ist die logOption veraltet. Verwenden Sie dies in my.cnf im [mysqld]Abschnitt, um die Protokolldatei anzugeben und die Protokollierung zu aktivieren :

general_log_file = /path/to/query.log
general_log      = 1

Alternativ können Sie die Protokollierung über die MySQL-Konsole aktivieren (Sie müssen auch den Speicherort der Protokolldatei angeben oder den Standardspeicherort suchen):

SET global general_log = 1;

Beachten Sie auch, dass es zusätzliche Optionen gibt, um nur langsame Abfragen zu protokollieren oder solche, die keine Indizes verwenden.

Gryphius
quelle
1
Dies funktioniert in MySQL 5.6.19 nicht. Haben sie es wieder geändert?
Alex R
5
general_log = on general_log_file = / path / to / query.log hat für mich
funktioniert
27
Dies funktionierte für mich (MySQL 5.6.12 unter Windows):SET global general_log_file='c:/Temp/mysql.log'; SET global general_log = on; SET global log_output = 'file';
Sie
Stellen Sie sicher, dass der MySQL-Benutzer Zugriffsberechtigungen für die Protokolldatei hat.
Will R.
Für 5.6.22 @youen hat es genau richtig gemacht. Vielen Dank! Das einzige, was Sie sicherstellen müssen, ist, dass das Verzeichnis und die Datei, in die geschrieben wird, vorhanden und von MySQL beschreibbar sind.
NightOwlPrgmr
189

Schauen Sie sich diese Antwort auf eine andere verwandte Frage an. Es zeigt, wie Sie die Protokolle auf Live-Servern aktivieren, deaktivieren und anzeigen können, ohne sie neu zu starten.

Protokollieren Sie alle Abfragen in MySQL


Hier ist eine Zusammenfassung:

Wenn Sie den MySQL-Server nicht neu starten möchten oder können, können Sie auf Ihrem laufenden Server folgendermaßen vorgehen:

  • Erstellen Sie Ihre Protokolltabellen (siehe Antwort )

  • Aktivieren Sie die Abfrageprotokollierung in der Datenbank (Beachten Sie, dass die Zeichenfolge 'Tabelle' wörtlich gesetzt und nicht durch einen Tabellennamen ersetzt werden sollte. Vielen Dank, Nicholas Pickering )

SET global general_log = 1;
SET global log_output = 'table';
  • Zeigen Sie das Protokoll an
select * from mysql.general_log;
  • Deaktivieren Sie die Abfrageprotokollierung in der Datenbank
SET global general_log = 0;
Alexandre Marcondes
quelle
18
Es ist zu beachten, dass 'Tabelle' wörtlich eingegeben und nicht durch einen Tabellennamen in Ihrer Datenbank ersetzt werden soll.
Nicholas Pickering
1
Unter Mac OS X scheint das MySQL-Software-Installationsprogramm die Tabelle general_log vom Typ CSV automatisch erstellt zu haben. Dies bedeutet, dass ich auch die entsprechende CSV-Datei verfolgen kann: sudo tail -f -n 250 /usr/local/mysql/data/mysql/general_log.CSV
Jay Sheth
Nach dem Einstellen von global log_output = 'table'; Wird eine langsame Abfrage in eine Datei geschrieben? Ich denke nach SET global general_log = 0; Sie sollten den vorherigen Wert für 'log_output' festlegen. Es ist wahrscheinlich 'FILE'
user2602807,
59

Ich verwende diese Methode für die Protokollierung, wenn ich verschiedene Seitenladevorgänge schnell optimieren möchte. Es ist ein kleiner Tipp ...

Anmelden an einer TABELLE

SET global general_log = 1;
SET global log_output = 'table';

Sie können dann aus meiner mysql.general_logTabelle auswählen , um die letzten Abfragen abzurufen.

Ich kann dann etwas Ähnliches wie tail -fauf mysql.log tun, aber mit mehr Verfeinerungen ...

select * from mysql.general_log 
where  event_time  > (now() - INTERVAL 8 SECOND) and thread_id not in(9 , 628)
and argument <> "SELECT 1" and argument <> "" 
and argument <> "SET NAMES 'UTF8'"  and argument <> "SHOW STATUS"  
and command_type = "Query"  and argument <> "SET PROFILING=1"

Dies macht es einfach, meine Fragen zu sehen, die ich versuchen kann, zu reduzieren. Ich verwende ein Intervall von 8 Sekunden, um nur Abfragen abzurufen, die innerhalb der letzten 8 Sekunden ausgeführt wurden.

Layke
quelle
57

Dies war bereits in einem Kommentar, verdient aber eine eigene Antwort: Ohne die Konfigurationsdateien zu bearbeiten: In MySQL als Root tun

SET global general_log_file='/tmp/mysql.log'; 
SET global log_output = 'file';
SET global general_log = on;

Vergessen Sie nicht, es danach auszuschalten:

SET global general_log = off;
Commonpike
quelle
1
Ich habe festgestellt, dass unter Linux systemd, wenn Sie versuchen, sich bei einer Datei anzumelden /tmp/, es irgendwo /tmp/systemd-private-...-mariadb.service-.../tmp/
landen
14

Sie können das allgemeine Abfrageprotokoll (das alle Abfragen protokolliert) mit deaktivieren oder aktivieren

SET GLOBAL general_log = 1 # (or 0 to disable)
Jon
quelle
In meinem Fall kann das allgemeine Abfrageprotokoll auf gemeinsam genutzten Hosting-Servern nicht aktiviert werden. Ich kann nur das langsame Abfrageprotokoll aktivieren, und die Systemadministratoren können auf Anfrage die Einträge für mein Konto bereitstellen.
Feng-Chun Ting
9

Ich wollte auch die MySQL-Protokolldatei aktivieren, um die Abfragen anzuzeigen, und habe dies mit den folgenden Anweisungen behoben

  1. Gehe zu /etc/mysql/mysql.conf.d
  2. Öffnen Sie die Datei mysqld.cnf

und aktivieren Sie die folgenden Zeilen

general_log_file        = /var/log/mysql/mysql.log
general_log             = 1
  1. Starten Sie MySQL mit diesem Befehl neu /etc/init.d/mysql restart
  2. Gehen Sie zu /var/log/mysql/und überprüfen Sie die Protokolle
Shrikant
quelle
Es ist in Ordnung, diese Einstellungen in der conf-Datei zu speichern, um sie bei jedem Start von MySQL anzuwenden. Sie müssen MySQL jedoch nicht neu starten, um diese Konfiguration anzuwenden. Sie können es mit 'SET global' einstellen, wie andere sagten.
Engel
6
// To see global variable is enabled or not and location of query log    
SHOW VARIABLES like 'general%';
// Set query log on 
SET GLOBAL general_log = ON; 
Sameer Kumar Choudhary
quelle
3

Unter Windows können Sie einfach zu gehen

C:\wamp\bin\mysql\mysql5.1.53\my.ini

Fügen Sie diese Zeile in my.ini ein

general_log_file = c:/wamp/logs/mysql_query_log.log

Die my.ini- Datei sieht endlich so aus

...
...
...    
socket      = /tmp/mysql.sock
skip-locking
key_buffer = 16M
max_allowed_packet = 1M
table_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
basedir=c:/wamp/bin/mysql/mysql5.1.53
log = c:/wamp/logs/mysql_query_log.log        #dump query logs in this file
log-error=c:/wamp/logs/mysql.log
datadir=c:/wamp/bin/mysql/mysql5.1.53/data
...
...
...
...
HimalayanCoder
quelle
3

Es gibt einen Fehler in der MySQL 5.6-Version. Sogar mysqld zeigen als:

    Default options are read from the following files in the given order:
C:\Windows\my.ini C:\Windows\my.cnf C:\my.ini C:\my.cnf c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.ini c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.cnf 

Die tatsächlichen Einstellungen werden in der folgenden Reihenfolge angezeigt:

    Default options are read from the following files in the given order:
C:\ProgramData\MySQL\MySQL Server 5.6\my.ini C:\Windows\my.ini C:\Windows\my.cnf C:\my.ini C:\my.cnf c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.ini c:\Program Files (x86)\MySQL\MySQL Server 5.6\my.cnf

Überprüfen Sie die Datei: "C: \ ProgramData \ MySQL \ MySQL Server 5.6 \ my.ini"

Hoffe es hilft jemandem.

Croonx
quelle
Gibt es irgendwo einen Fehlerbericht für diesen Fehler?
mwfearnley
1

für mysql> = 5.5 nur für langsame Abfragen (1 Sekunde und mehr) my.cfg

[mysqld]
slow-query-log = 1
slow-query-log-file = /var/log/mysql/mysql-slow.log
long_query_time = 1
log-queries-not-using-indexes
lptn
quelle
1
Dies ist falsch - das aktiviert das langsame Abfrageprotokoll, nicht das Abfrageprotokoll.
Sam Dufel
Ich denke, Sie müssen Bindestriche verwenden.
AFA Med
1

So aktivieren Sie das Abfrageprotokoll in MAC Machine:

Öffnen Sie die folgende Datei:

vi /private/etc/my.cnf

Stellen Sie die URL des Abfrageprotokolls im Abschnitt 'mysqld' wie folgt ein:

[mysqld]

general_log_file=/Users/kumanan/Documents/mysql_query.log

Nur wenige Computer protokollieren Abfragen nicht ordnungsgemäß. In diesem Fall können Sie sie über die MySQL-Konsole aktivieren

mysql> SET global general_log = 1;
Kumanan
quelle
1

Nicht gerade eine Antwort auf die Frage, da die Frage bereits gute Antworten hat. Dies ist eine Nebeninformation. Durch das Aktivieren von general_log wird die MySQL-Leistung erheblich beeinträchtigt. Ich bin general_log =1versehentlich auf einem Produktionsserver abgereist und habe stundenlang herausgefunden, warum die Leistung nicht mit einem ähnlichen Setup auf anderen Servern vergleichbar ist. Dann habe ich dies gefunden, was die Auswirkungen der Aktivierung des allgemeinen Protokolls erklärt. http://www.fromdual.com/general_query_log_vs_mysql_performance .

Kern der Geschichte, nicht general_log=1in die .cnfAkte eintragen. Verwenden set global general_log =1Sie es stattdessen für eine kurze Zeit, um sich zu protokollieren und herauszufinden, was Sie herausfinden möchten, und schalten Sie es dann aus.

Allen King
quelle
0

In phpMyAdmin 4.0 gehen Sie zu Status> Monitor. Dort können Sie das langsame Abfrageprotokoll und das allgemeine Protokoll aktivieren, einen Live-Monitor anzeigen, einen Teil des Diagramms auswählen, die zugehörigen Abfragen anzeigen und analysieren.

Marc Delisle
quelle
0

Ich musste das allgemeine Protokoll irgendwann löschen und neu erstellen. Während der Neuerstellung wurden die Zeichensätze durcheinander gebracht und ich hatte diesen Fehler in den Protokollen:

[ERROR] Incorrect definition of table mysql.general_log: expected the type of column 'user_host' at position 1 to have character set 'utf8' but found character set 'latin1'

Wenn die Standardantwort "Überprüfen, ob die Protokollierung aktiviert ist" für Sie nicht funktioniert, überprüfen Sie, ob Ihre Felder den richtigen Zeichensatz haben.

William Neely
quelle