Registra tutte le query in mysql


279

È possibile attivare la registrazione di controllo sul mio database mysql?

Fondamentalmente voglio monitorare tutte le query per un'ora e scaricare il registro in un file.



Vantaggio per i lettori: non mancate di leggere la domanda nel commento sopra.
artigli

Puoi fare riferimento alla mia risposta esistente pubblicata qui dba.stackexchange.com/a/62477/6037
Peter Venderberghe,

Risposte:


166

Avviare mysql con l'opzione --log:

mysqld --log=log_file_name

oppure inserisci quanto segue nel tuo my.cnffile:

log = log_file_name

Uno dei due registrerà tutte le query in log_file_name.

È inoltre possibile registrare solo query lente utilizzando l' --log-slow-queriesopzione anziché --log. Per impostazione predefinita, le query che richiedono 10 secondi o più sono considerate lente, è possibile modificarlo impostando long_query_timeil numero di secondi che una query deve eseguire prima di essere registrata.


61
Va da sé, ma lasciare questo acceso in una scatola di produzione finisce per non essere molto divertente molto rapidamente. g
ceejayoz,

6
Se si riscontrano problemi con l'attivazione della registrazione in questo modo, verificare due volte che l'utente mysql possa scrivere nella posizione del file appropriata.
Jon Topper,

3
È possibile registrare le query solo su 1 particolare db / table?
Temujin,

2
@Temujin phpmyadmin ha ora un'opzione di 'tracciamento' per le tabelle in cui si specifica un registro ('versione') e manterrà il registro delle query che lo riguardano con informazioni sull'ora e l'intera query.
gadget00,

3
Questa risposta accettata deve essere eliminata o modificata per riflettere il fatto che non funziona con MySQL 5.6. +.
itoctopus

233

( Nota : per mysql-5.6 + questo non funzionerà. C'è una soluzione che si applica a mysql-5.6 + se scorri verso il basso o fai clic qui .)

Se non si desidera o non è possibile riavviare il server MySQL, è possibile procedere in questo modo sul server in esecuzione:

  • Crea le tue tabelle di registro sul mysqldatabase
  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'
  • Abilita registrazione query sul database
SET global general_log = 1;
SET global log_output = 'table';
  • Visualizza il registro
select * from mysql.general_log
  • Disabilita la registrazione delle query sul database
SET global general_log = 0;

14
Non sono sicuro che questo sia vero per ogni versione di MySQL (sono su 5.5), ma non ho dovuto creare le tabelle. Ho seguito gli stessi consigli meno la creazione delle tabelle, che è menzionata qui: stackoverflow.com/a/678310/135101
Tyler Collier

Forse è già stato creato per l'una o l'altra ragione, @TylerCollier
Alexandre Marcondes,

3
Va notato che i CREATE TABLEcomandi (se le tabelle non esistono già) devono essere eseguiti sul mysqldatabase, non su qualsiasi database creato dall'utente. Forse le istruzioni SQL potrebbero essere aggiornate per riflettere ciò.
Robert Rossmann,

2
Per visualizzare il registro SELECT * FROM mysql.general_log order by (event_time) descandrà meglio.
sto

Non sono d'accordo con la nota : con la versione 5.6.37 del server funziona perfettamente. Grazie.
Dmitriy Olhovsky,

215

Oltre a quello che ho trovato qui, eseguire il seguente è il modo più semplice per scaricare le query in un file di registro senza riavviare

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

può essere spento con

SET global general_log = 0;

6
Adoro questo, funziona per connessioni esistenti e nuove sul DB
Carlton,

1
C'erano alcune voci di statistiche - non sono sicuro di cosa siano, ma, altrimenti, funzionano davvero bene.
Snowcrash,

Affinché ciò funzioni, l'utente deve disporre del privilegio SUPER, che è un privilegio DB globale e quindi non può essere limitato a schemi o tabelle specifici:GRANT SUPER ON *.* TO user1@localhost
RobM

Vorrei che più di una volta, se potessi, ho un segnalibro che punta qui :) Grazie mille!
resi

125

La risposta migliore non funziona in mysql 5.6+. Usa questo invece:

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

nel tuo file my.cnf / my.ini

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


1
Se l'hai usato, puoi dirmi l'impatto sulle prestazioni di quanto sopra e sarebbe saggio abilitare la registrazione in questo modo?
Ramesh Pareek,

1
L'impatto sulle prestazioni di Ramesh sembra diminuire del 5-15% circa delle prestazioni. Maggiori informazioni qui percona.com/blog/2009/02/10/…
Firze

1
Non capisco perché Mysql 5.6 non consenta di impostare il file di registro dalle query? Come registrare tutte le query in MySQL 5.6 e versioni successive quando non si ha accesso all'albero delle directory del server ma solo phpMyAdmin?
Vicky Dev,

riavvia il servizio mysql dal pannello di controllo di xampp dopo queste modifiche.
Paramjeet

Questo ha funzionato per me nel mio ambiente Apache Xampp locale, ma ho comunque dovuto attivare la registrazione tramite phpMyAdmin. Inoltre, non è stato in grado di individuare il file nella cartella / usr / log, né lo creerebbe, ma ha funzionato perfettamente comegeneral_log_file=filename.log
JoeP,

36

Abilita il registro per la tabella

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

Visualizza il registro selezionando query

select * from mysql.general_log

c'è un carattere jolly per registrare tutte le tabelle? (ce ne sono parecchi: C)
RicardoE

Grazie, questa impostazione mi è stata molto utile in quanto non ho potuto smontare il server mysql. Voglio anche che il registro appaia nella tabella di registro
Gunnar Sigfusson,

14

Modo rapido per abilitare MySQL General Query Log senza riavviare.

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

Ho installato mysql tramite homebrew, versione mysql: mysql Ver 14.14 Distrib 5.7.15, per osx10.11 (x86_64) usando il wrapper EditLine


6

Per la cronaca, general_log e slow_log sono stati introdotti in 5.1.6:

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

5.2.1. Selezione delle destinazioni di output del Query generale e del Query lento

A partire da MySQL 5.1.6, MySQL Server offre un controllo flessibile sulla destinazione dell'output nel registro generale delle query e nel registro lento delle query, se tali registri sono abilitati. Le possibili destinazioni per le voci di registro sono i file di registro o le tabelle general_log e slow_log nel database mysql


5

Dovresti essere consapevole del fatto che l'accesso a mysql influisce davvero sulle prestazioni, ma può essere una cosa saggia da fare.

Di solito lo lascio sul server dev (tranne quando ci fa impazzire :))


2

Versione OS / mysql:

$ 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

Aggiunta della registrazione (esempio, non credo /var/log/...sia il percorso migliore su Mac OS ma ha funzionato:

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

Riavviato Mysql

Risultato:

$ 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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.