Come abilitare il log delle query MySQL?


252

Come abilito la funzione MySQL che registra ogni istruzione di query SQL ricevuta dai client e l'ora in cui è stata inviata l'istruzione di query? Posso farlo in phpmyadmin o NaviCat? Come analizzo il registro?

Risposte:


302

Innanzitutto, ricorda che questo file di registro può diventare molto grande su un server occupato.

Per mysql <5.1.29:

Per abilitare il registro delle query, inseriscilo /etc/my.cnfnella [mysqld]sezione

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

Inoltre, per abilitarlo dalla console MySQL

SET general_log = 1;

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

Per mysql 5.1.29+

Con mysql 5.1.29+, l' logopzione è obsoleta. Per specificare il file di registro e abilitare la registrazione, utilizzare questo in my.cnf nella [mysqld]sezione:

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

In alternativa, per attivare la registrazione dalla console MySQL (è necessario specificare in qualche modo la posizione del file di registro o trovare la posizione predefinita):

SET global general_log = 1;

Si noti inoltre che sono disponibili opzioni aggiuntive per registrare solo query lente o quelle che non utilizzano gli indici.


1
Questo non funziona in MySQL 5.6.19. L'hanno cambiato di nuovo?
Alex R

5
general_log = on general_log_file = / path / to / query.log ha funzionato per me
Kiren Siva,

27
Questo ha funzionato per me (MySQL 5.6.12 su Windows):SET global general_log_file='c:/Temp/mysql.log'; SET global general_log = on; SET global log_output = 'file';
Youen

Assicurati che l'utente mysql acceda alle autorizzazioni per il file di registro, altrimenti restituirà un errore 'non trovato' quando imposta il parametro general_log nella console MySQL
Will R.

Per 5.6.22 @youen ha capito bene. Grazie! L'unica cosa da verificare è che la directory e il file su cui si sta scrivendo esistano e siano scrivibili da mysql.
NightOwlPrgmr,

189

Dai un'occhiata a questa risposta a un'altra domanda correlata. Mostra come abilitare, disabilitare e vedere i log sui server live senza riavviare.

Registra tutte le query in mysql


Ecco un riassunto:

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 (vedi risposta )

  • Abilita la registrazione delle query sul database (Nota che la stringa 'table' dovrebbe essere messa letteralmente e non sostituita da nessun nome di tabella. Grazie Nicholas Pickering )

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;

19
Va notato che "tabella" deve essere inserita letteralmente e non sostituita con un nome di tabella nel database.
Nicholas Pickering,

1
Su Mac OS X, il programma di installazione del software MySQL sembra aver creato automaticamente la tabella general_log, con il tipo CSV. Questo significa che posso anche mettere in coda il file CSV corrispondente: sudo tail -f -n 250 /usr/local/mysql/data/mysql/general_log.CSV
Jay Sheth

Dopo aver impostato global log_output = 'table'; è la query lenta verrà scritta in un file? Penso che dopo SET global general_log = 0; dovresti impostare il precedente valore 'log_output', probabilmente è 'FILE'
user2602807

59

Uso questo metodo per la registrazione quando voglio ottimizzare rapidamente diversi caricamenti di pagina. È un piccolo consiglio ...

Accedere a una TABELLA

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

È quindi possibile selezionare dalla mia mysql.general_logtabella per recuperare le query recenti.

Posso quindi fare qualcosa di simile a tail -fsu mysql.log, ma con più perfezionamenti ...

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"

Questo rende facile vedere le mie domande che posso provare a ridurre. Uso l'intervallo di 8 secondi per recuperare solo le query eseguite negli ultimi 8 secondi.


57

Questo era già in un commento, ma merita la sua risposta: senza modificare i file di configurazione: in mysql, come root, fare

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

Non dimenticare di spegnerlo in seguito:

SET global general_log = off;

1
Ho scoperto che in Linux systemd, se si tenta di accedere a un file /tmp/, potrebbe finire in un posto come/tmp/systemd-private-...-mariadb.service-.../tmp/
mwfearnley,

15

È possibile disabilitare o abilitare il registro generale delle query (che registra tutte le query) con

SET GLOBAL general_log = 1 # (or 0 to disable)

Nel mio caso, il log delle query generali non può essere abilitato sui server di hosting condivisi. Posso solo abilitare il registro delle query lente abilitato e gli amministratori di sistema possono fornire le voci relative al mio account su richiesta.
Feng-Chun Ting

9

Volevo anche abilitare il file di log di MySQL per vedere le query e l'ho risolto con le istruzioni seguenti

  1. Vai a /etc/mysql/mysql.conf.d
  2. apri mysqld.cnf

e abilitare le righe sottostanti

general_log_file        = /var/log/mysql/mysql.log
general_log             = 1
  1. riavviare MySQL con questo comando /etc/init.d/mysql restart
  2. vai a /var/log/mysql/e controlla i registri

Va bene salvare quelle impostazioni nel file conf per poterle applicare ogni volta che si avvia MySQL, ma non è necessario riavviare MySQL per applicare questa configurazione. Puoi impostarlo usando 'SET global' come altri hanno detto.
Angelo,

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; 

3

Su Windows puoi semplicemente andare a

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

Inserisci questa riga in my.ini

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

Il file my.ini ha finalmente questo aspetto

...
...
...    
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
...
...
...
...

3

C'è un bug nella versione di MySQL 5.6. Anche mysqld mostra come:

    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 

Le impostazioni vengono effettivamente lette nel seguente ordine:

    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

Controlla il file: "C: \ ProgramData \ MySQL \ MySQL Server 5.6 \ my.ini"

Spero che aiuti qualcuno.


Esiste un bug report da qualche parte per questo bug?
mwfearnley,

1

per mysql> = 5.5 solo per query lente (1 secondo e più) 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

1
Ciò non è corretto: ciò abilita il registro delle query lento, non il registro delle query.
Sam Dufel,

Penso che devi usare i trattini.
AFA Med,

1

Per abilitare il registro delle query in MAC Machine:

Apri il seguente file:

vi /private/etc/my.cnf

Impostare l'URL del registro delle query nella sezione "mysqld" come segue:

[mysqld]

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

Poche macchine non registrano correttamente le query, quindi in questo caso è possibile abilitarlo dalla console MySQL

mysql> SET global general_log = 1;

1

Non è esattamente una risposta alla domanda perché la domanda ha già ottime risposte. Questa è un'informazione laterale. L'abilitazione di general_log mette davvero a dura prova le prestazioni di MySQL. Ho lasciato general_log =1accidentalmente su un server di produzione e ho trascorso ore a scoprire perché le prestazioni non erano paragonabili a una configurazione simile su altri server. Poi ho trovato questo che spiega l'impatto dell'abilitazione del registro generale. http://www.fromdual.com/general_query_log_vs_mysql_performance .

Sintesi della storia, non inserire general_log=1il .cnffile. Utilizzalo invece set global general_log =1per una breve durata solo per accedere abbastanza per scoprire cosa stai cercando di scoprire e poi spegnerlo.


0

In phpMyAdmin 4.0, vai su Stato> Monitor. Qui puoi abilitare il registro delle query lente e il registro generale, vedere un monitor live, selezionare una parte del grafico, vedere le query correlate e analizzarle.


0

Ho dovuto abbandonare e ricreare il registro generale ad un certo punto. Durante la ricreazione, i set di caratteri si sono incasinati e alla fine ho riscontrato questo errore nei registri:

[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'

Quindi, se la risposta standard di "controlla per assicurarsi che la registrazione sia attiva" non funziona per te, controlla per assicurarti che i tuoi campi abbiano il set di caratteri giusto.

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.