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?
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?
Antworten:
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.cnf
in 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 log
Option 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.
SET global general_log_file='c:/Temp/mysql.log';
SET global general_log = on;
SET global log_output = 'file';
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';
select * from mysql.general_log;
SET global general_log = 0;
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_log
Tabelle auswählen , um die letzten Abfragen abzurufen.
Ich kann dann etwas Ähnliches wie tail -f
auf 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.
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;
/tmp/
, es irgendwo /tmp/systemd-private-...-mariadb.service-.../tmp/
Sie können das allgemeine Abfrageprotokoll (das alle Abfragen protokolliert) mit deaktivieren oder aktivieren
SET GLOBAL general_log = 1 # (or 0 to disable)
Ich wollte auch die MySQL-Protokolldatei aktivieren, um die Abfragen anzuzeigen, und habe dies mit den folgenden Anweisungen behoben
/etc/mysql/mysql.conf.d
und aktivieren Sie die folgenden Zeilen
general_log_file = /var/log/mysql/mysql.log
general_log = 1
/etc/init.d/mysql restart
/var/log/mysql/
und überprüfen Sie die Protokolle// 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;
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
...
...
...
...
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.
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
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;
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 =1
versehentlich 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=1
in die .cnf
Akte eintragen. Verwenden set global general_log =1
Sie es stattdessen für eine kurze Zeit, um sich zu protokollieren und herauszufinden, was Sie herausfinden möchten, und schalten Sie es dann aus.
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.
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.