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?
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:
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.cnf
nella [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' log
opzione è 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.
SET global general_log_file='c:/Temp/mysql.log';
SET global general_log = on;
SET global log_output = 'file';
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';
select * from mysql.general_log;
SET global general_log = 0;
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_log
tabella per recuperare le query recenti.
Posso quindi fare qualcosa di simile a tail -f
su 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.
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;
/tmp/
, potrebbe finire in un posto come/tmp/systemd-private-...-mariadb.service-.../tmp/
È possibile disabilitare o abilitare il registro generale delle query (che registra tutte le query) con
SET GLOBAL general_log = 1 # (or 0 to disable)
Volevo anche abilitare il file di log di MySQL per vedere le query e l'ho risolto con le istruzioni seguenti
/etc/mysql/mysql.conf.d
e abilitare le righe sottostanti
general_log_file = /var/log/mysql/mysql.log
general_log = 1
/etc/init.d/mysql restart
/var/log/mysql/
e controlla i registri// 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;
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
...
...
...
...
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.
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
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;
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 =1
accidentalmente 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=1
il .cnf
file. Utilizzalo invece set global general_log =1
per una breve durata solo per accedere abbastanza per scoprire cosa stai cercando di scoprire e poi spegnerlo.
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.
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.