Protokollieren Sie alle Abfragen in MySQL


279

Kann ich die Überwachungsprotokollierung in meiner MySQL-Datenbank aktivieren?

Grundsätzlich möchte ich alle Abfragen eine Stunde lang überwachen und das Protokoll in eine Datei kopieren.



Für die Leser von Vorteil: Verpassen Sie nicht, die Frage im obigen Kommentar zu lesen.
Krallen

Sie können meine vorhandene Antwort hier dba.stackexchange.com/a/62477/6037
Peter Venderberghe

Antworten:


165

Starten Sie MySQL mit der Option --log:

mysqld --log=log_file_name

oder fügen Sie Folgendes in Ihre my.cnfDatei ein:

log = log_file_name

In beiden Fällen werden alle Abfragen unter log_file_name protokolliert.

Sie können auch nur langsame Abfragen mit der --log-slow-queriesOption anstelle von protokollieren --log. Standardmäßig werden Abfragen, die 10 Sekunden oder länger dauern, als langsam angesehen. Sie können dies ändern, indem Sie long_query_timedie Anzahl der Sekunden festlegen, die eine Abfrage benötigt, um ausgeführt zu werden, bevor sie protokolliert wird.


61
Es sollte selbstverständlich sein, aber wenn dies in einer Produktionsbox eingeschaltet bleibt, wird es sehr schnell nicht unterhaltsam. g
ceejayoz

6
Wenn Sie Probleme haben, die Protokollierung auf diese Weise zu aktivieren, überprüfen Sie doppelt, ob der MySQL-Benutzer an den entsprechenden Dateispeicherort schreiben kann.
Jon Topper

3
Ist es möglich, Abfragen nur über 1 bestimmte Datenbank / Tabelle zu protokollieren?
Temujin

2
@Temujin phpmyadmin verfügt jetzt über eine Verfolgungsoption für Tabellen, in denen Sie ein Protokoll ('Version') angeben, und zeichnet die betroffenen Abfragen mit Informationen zur Zeit und zur gesamten Abfrage auf.
Gadget00

3
Diese akzeptierte Antwort sollte gelöscht oder bearbeitet werden, um der Tatsache Rechnung zu tragen, dass sie mit MySQL 5.6 nicht funktioniert. +.
Itoctopus

233

( Hinweis : Für MySQL-5.6 + funktioniert dies nicht. Es gibt eine Lösung, die für MySQL-5.6 + gilt, wenn Sie nach unten scrollen oder hier klicken .)

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 in der mysqlDatenbank
  CREATE TABLE `slow_log` (
   `start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 
                          ON UPDATE CURRENT_TIMESTAMP,
   `user_host` mediumtext NOT NULL,
   `query_time` time NOT NULL,
   `lock_time` time NOT NULL,
   `rows_sent` int(11) NOT NULL,
   `rows_examined` int(11) NOT NULL,
   `db` varchar(512) NOT NULL,
   `last_insert_id` int(11) NOT NULL,
   `insert_id` int(11) NOT NULL,
   `server_id` int(10) unsigned NOT NULL,
   `sql_text` mediumtext NOT NULL,
   `thread_id` bigint(21) unsigned NOT NULL
  ) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log'
  CREATE TABLE `general_log` (
   `event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
                          ON UPDATE CURRENT_TIMESTAMP,
   `user_host` mediumtext NOT NULL,
   `thread_id` bigint(21) unsigned NOT NULL,
   `server_id` int(10) unsigned NOT NULL,
   `command_type` varchar(64) NOT NULL,
   `argument` mediumtext NOT NULL
  ) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log'
  • Aktivieren Sie die Abfrageprotokollierung in der Datenbank
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;

14
Ich bin nicht sicher, ob dies für jede Version von MySQL gilt (ich bin auf 5.5), aber ich musste die Tabellen nicht erstellen. Ich habe den gleichen Rat befolgt, ohne die Tabellen zu erstellen, die hier erwähnt werden: stackoverflow.com/a/678310/135101
Tyler Collier

Vielleicht wurde es bereits aus dem einen oder anderen Grund erstellt, @ TylerCollier
Alexandre Marcondes

3
Es ist zu beachten, dass die CREATE TABLEBefehle (falls die Tabellen noch nicht vorhanden sind) in der mysqlDatenbank ausgeführt werden sollten, nicht in von Benutzern erstellten Datenbanken. Möglicherweise könnten die SQL-Anweisungen aktualisiert werden, um dies widerzuspiegeln.
Robert Rossmann

2
Zum Anzeigen ist das Protokoll SELECT * FROM mysql.general_log order by (event_time) descbesser geeignet. nur sagen. :-)
vinrav

Stimmen Sie dem Hinweis nicht zu - mit Server Version 5.6.37 funktioniert es vollständig korrekt. Vielen Dank.
Dmitriy Olhovsky

215

Abgesehen von dem, was mir hier begegnet ist, war das Ausführen der folgenden Schritte die einfachste Möglichkeit, Abfragen ohne Neustart in eine Protokolldatei zu kopieren

SET global log_output = 'FILE';
SET global general_log_file='/Applications/MAMP/logs/mysql_general.log';
SET global general_log = 1;

kann mit ausgeschaltet werden

SET global general_log = 0;

6
Ich liebe das absolut, arbeite für bestehende und neue Verbindungen auf der DB
Carlton

1
Es gab einige Statistikeinträge - nicht sicher, was das sind, aber ansonsten funktioniert es wirklich gut.
Snowcrash

Damit dies funktioniert, muss Ihr Benutzer über das SUPER-Privileg verfügen, das ein globales DB-Privileg ist und daher nicht auf bestimmte Schemas oder Tabellen beschränkt werden kann:GRANT SUPER ON *.* TO user1@localhost
RobM

Ich würde das mehr als einmal positiv bewerten, wenn ich könnte, ich habe ein Lesezeichen, das hier zeigt :) Vielen Dank!
Resi

124

Die Top-Antwort funktioniert in MySQL 5.6+ nicht. Verwenden Sie stattdessen Folgendes:

[mysqld]
general_log = on
general_log_file=/usr/log/general.log

in Ihrer my.cnf / my.ini-Datei

Ubuntu / Debian : /etc/mysql/my.cnf
Windows - : c: \ Programme \ MySQL \ MySQL Server 5.x
wamp : c: \ wamp \ bin \ mysql \ mysqlx.yz \ my.ini
xampp : c: \ xampp \ mysql \ bin \ my.ini.


Wenn Sie es verwendet haben, können Sie mir die Auswirkungen der oben genannten Leistung auf die Leistung mitteilen. Wäre es sinnvoll, die Protokollierung auf diese Weise zu aktivieren?
Ramesh Pareek

1
Die Auswirkungen auf die Ramesh-Leistung scheinen bei etwa 5 bis 15% zu liegen. Weitere Infos hier percona.com/blog/2009/02/10/…
Firze

1
Ich verstehe nicht, warum Mysql 5.6 das Festlegen von Protokolldateien aus Abfragen nicht zulässt. Wie protokolliere ich alle Abfragen in MySQL 5.6 und höher, wenn Sie nicht auf den Serververzeichnisbaum zugreifen können, sondern nur phpMyAdmin?
Vicky Dev

Starten Sie den MySQL-Dienst nach diesen Änderungen über das xampp-Kontrollfeld neu.
Paramjeet

Dies funktionierte für mich in meiner lokalen Xampp Apache-Umgebung, aber ich musste die Anmeldung immer noch über phpMyAdmin aktivieren. Es konnte die Datei auch nicht im Ordner / usr / log finden und auch nicht erstellen, aber es funktionierte general_log_file=filename.log
einwandfrei

36

Aktivieren Sie das Protokoll für die Tabelle

mysql> SET GLOBAL general_log = 'ON';
mysql> SET global log_output = 'table';

Zeigen Sie das Protokoll an, indem Sie eine Abfrage auswählen

select * from mysql.general_log

Gibt es einen Platzhalter zum Protokollieren aller Tabellen? (Es gibt ziemlich viele: C)
RicardoE

Vielen Dank, diese Einstellung war sehr nützlich für mich, da ich den MySQL-Server nicht herunterfahren konnte. Ich möchte auch, dass das Protokoll in der Protokolltabelle erscheint
Gunnar Sigfusson

14

Schnelle Möglichkeit, das allgemeine MySQL-Abfrageprotokoll ohne Neustart zu aktivieren.

mysql> SET GLOBAL general_log = 'ON';
mysql> SET GLOBAL general_log_file = '/var/www/nanhe/log/all.log';

Ich habe MySQL über Homebrew, MySQL-Version: MySQL Ver 14.14 Distrib 5.7.15, für OSX10.11 (x86_64) mit dem EditLine-Wrapper installiert


6

Für den Datensatz wurden general_log und slow_log in 5.1.6 eingeführt:

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

5.2.1. Auswählen von Ausgabezielen für allgemeine Abfragen und langsame Abfrageprotokolle

Ab MySQL 5.1.6 bietet MySQL Server eine flexible Steuerung des Ausgabeziels für das allgemeine Abfrageprotokoll und das langsame Abfrageprotokoll, sofern diese Protokolle aktiviert sind. Mögliche Ziele für Protokolleinträge sind Protokolldateien oder die Tabellen general_log und slow_log in der MySQL-Datenbank


5

Sie sollten sich bewusst sein, dass sich die Anmeldung bei MySQL wirklich auf die Leistung auswirkt, aber es kann sinnvoll sein, dies zu tun.

Normalerweise lasse ich es auf dem Dev-Server (außer wenn es uns verrückt macht :))


2

OS / MySQL-Version:

$ uname -a
Darwin Raphaels-MacBook-Pro.local 15.6.0 Darwin Kernel Version 15.6.0: Thu Jun 21 20:07:40 PDT 2018; root:xnu-3248.73.11~1/RELEASE_X86_64 x86_64

$ mysql --version
/usr/local/mysql/bin/mysql  Ver 14.14 Distrib 5.6.23, for osx10.8 (x86_64) using  EditLine wrapper

Hinzufügen der Protokollierung (Beispiel: Ich denke nicht, dass dies /var/log/...der beste Pfad unter Mac OS ist, aber das hat funktioniert:

sudo vi ./usr/local/mysql-5.6.23-osx10.8-x86_64/my.cnf

[mysqld]
general_log = on
general_log_file=/var/log/mysql/mysqld_general.log

MySQL neu gestartet

Ergebnis:

$ sudo tail -f /var/log/mysql/mysqld_general.log
181210  9:41:04    21 Connect   root@localhost on employees
           21 Query /* mysql-connector-java-5.1.47 ( Revision: fe1903b1ecb4a96a917f7ed3190d80c049b1de29 ) */SELECT  @@session.auto_increment_increment AS auto_increment_increment, @@character_set_client AS character_set_client, @@character_set_connection AS character_set_connection, @@character_set_results AS character_set_results, @@character_set_server AS character_set_server, @@collation_server AS collation_server, @@collation_connection AS collation_connection, @@init_connect AS init_connect, @@interactive_timeout AS interactive_timeout, @@license AS license, @@lower_case_table_names AS lower_case_table_names, @@max_allowed_packet AS max_allowed_packet, @@net_buffer_length AS net_buffer_length, @@net_write_timeout AS net_write_timeout, @@query_cache_size AS query_cache_size, @@query_cache_type AS query_cache_type, @@sql_mode AS sql_mode, @@system_time_zone AS system_time_zone, @@time_zone AS time_zone, @@tx_isolation AS transaction_isolation, @@wait_timeout AS wait_timeout
           21 Query SET NAMES latin1
           21 Query SET character_set_results = NULL
           21 Query SET autocommit=1
           21 Query SELECT USER()
           21 Query SELECT USER()
181210  9:41:10    21 Query show tables
181210  9:41:25    21 Query select count(*) from current_dept_emp

1

Wenn Sie AWS RDS MYSQL verwenden, finden Sie hier eine schrittweise Anleitung.

Wenn diese Option als "Datei" -Ausgabe festgelegt ist, können Sie das Protokoll direkt in der AWS RDS-Protokollkonsole anzeigen.

AWS RDS MYSQL-Protokollierung

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.