2008-11-20 15 views
209

Ist es mir möglich, Audit-Logging auf meiner MySQL-Datenbank zu aktivieren?Alle Abfragen in mysql protokollieren

Ich möchte im Grunde alle Abfragen für eine Stunde überwachen und das Protokoll in eine Datei ausgeben.

+8

Doppelte Frage http://stackoverflow.com/q/650238/684229 – TMS

+0

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

+0

Sie können meine bestehende Antwort verweisen hier http://dba.stackexchange.com/a/62477/6037 –

Antwort

140

starten mysql mit der Option --log:

mysqld --log=log_file_name 

oder legen Sie folgendes in my.cnf Datei:

log = log_file_name 

Entweder werden alle Anfragen melden Sie sich an LOG_FILE_NAME.

Sie können auch nur langsame Abfragen mit der Option --log-slow-queries anstelle von --log protokollieren. Standardmäßig werden Abfragen, die 10 Sekunden oder länger dauern, als langsam betrachtet. Sie können dies ändern, indem Sie long_query_time auf die Anzahl der Sekunden setzen, die eine Abfrage ausführen muss, bevor sie protokolliert wird.

+0

+1 für wusste nicht, dass. Benutzte Auslöser stattdessen. –

+37

Es sollte selbstverständlich sein, aber das in einer Produktionskiste eingeschaltet zu lassen, wird sehr schnell nicht unterhaltsam. * g * – ceejayoz

+3

Wenn Sie Probleme beim Aktivieren der Protokollierung auf diese Weise haben, überprüfen Sie, ob der Benutzer mysql in den entsprechenden Speicherort schreiben kann. –

4

Sie sollten sich darüber im Klaren sein, dass mysql-Logging sich wirklich auf die Leistung auswirkt, aber es kann sinnvoll sein, dies zu tun.

ich es in der Regel auf dem Dev-Server verlassen auf (es sei denn, es treibt uns verrückt :))

193

(Hinweis: Für mysql-5.6 + dies nicht funktionieren Es gibt eine Lösung, die mysql gilt. -5.6+ wenn Sie scroll down oder click here)

wenn Sie nicht wollen oder können nicht den MySQL-Server neu starten Sie so auf Ihrem laufenden Server ablaufen kann.

  • erstellen Sie Ihre Log-Tabellen auf der.210 Datenbank
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 Abfrage in der Datenbank anmelden
SET global general_log = 1; 
SET global log_output = 'table'; 
  • Protokoll anzeigen
select * from mysql.general_log 
  • Deaktivieren Abfrageprotokollierung auf der Datenbank
SET global general_log = 0; 
+11

Ich bin nicht sicher, ob das für jede Version von MySQL gilt (ich bin auf 5.5), aber ich musste die Tabellen nicht erstellen. Ich folgte dem gleichen Rat abzüglich der Erstellung der Tabellen, die hier erwähnt wird: http://StackOverflow.com/a/678310/135101 –

+0

Vielleicht war es bereits aus dem einen oder anderen Grund erstellt, @TylerCollier –

+2

Es sollte angemerkt werden, dass die ' CREATE TABLE-Befehle sollten (falls die Tabellen noch nicht existieren) in der mysql-Datenbank ausgeführt werden, nicht in irgendwelchen vom Benutzer erstellten Datenbanken. Vielleicht könnten die SQL-Anweisungen aktualisiert werden, um dies zu berücksichtigen. –

6

Für die Aufzeichnung general_log und slow_log wurden in 5.1.6 eingeführt:

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

5.2.1. Auswahl der Ausgabeziele für die allgemeine Abfrage und das langsame Abfrageprotokoll

Ab MySQL 5.1.6, bietet MySQL Server flexible Kontrolle über das Ziel der Ausgabe an das allgemeine Abfrageprotokoll und das langsame Abfrageprotokoll, , wenn diese Protokolle aktiviert sind. Mögliche Ziele für Protokolleinträge sind Protokolldateien oder die die general_log und slow_log Tabellen in der mysql Datenbank

146

Außer dem, was ich über hier kam, laufen die folgenden der einfachste Weg war Abfragen in eine Protokolldatei Dump ohne Neustart

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

mit

SET global general_log = 0; 
+3

Absolut lieben, funktioniert für bestehende und neue Verbindungen auf der DB – Carlton

+1

Es gab einige Statistiken Einträge - nicht sicher, was das sind, aber sonst funktioniert wirklich gut. – Snowcrash

84

Top Antwort funktioniert nicht in mysql ausgeschaltet werden 5.6+. Verwenden Sie stattdessen:

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

in Ihrer my.cnf/my.ini

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.

+0

Wenn Sie es verwendet haben, können Sie mir die Auswirkungen der oben genannten Leistung auf die Leistung mitteilen, und wäre es sinnvoll, die Protokollierung auf diese Weise zu aktivieren? –

+0

Ramesh Performance-Einbußen scheinen um 5-15% zu sinken. Mehr Infos hier https://www.percona.com/blog/2009/02/10/impact-of-logging-on-mysql%E2%80%99s-performance/ – Firze

+0

Ich verstehe nicht, warum Mysql 5.6 doesn ' t Logdatei darf nicht aus Abfragen gesetzt werden? Wie protokolliert man alle Abfragen in MySQL 5.6 und höher, wenn man keinen Zugriff auf den Verzeichnisbaum des Servers hat, sondern nur 'phpMyAdmin'? –

9

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 mysql durch Homebrew installiert haben, MySQL Version: mysql Ver 14.14 Distrib 5.7.15, für osx10.11 (x86_64) mit editline Wrapper

1

Bei Verwendung von AWS RDS MYSQL, Schritt Schritt Anleitung hier.

Bei der Einstellung 'Datei' können Sie das Protokoll direkt in der AWS RDS "Log" -Konsole anzeigen.

AWS RDS MYSQL Logging

17

für die Tabelle das Protokoll aktivieren

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

View log von Auswahlabfrage

select * from mysql.general_log 
+0

Gibt es einen Platzhalter, um alle Tabellen zu protokollieren? (Es gibt eine ganze Menge: C) – RicardoE