Come mostrare le ultime query eseguite su MySQL?


471

Esiste una query / un modo per mostrare le ultime query eseguite su TUTTI i server?

Risposte:


793

Per quelli benedetti con MySQL> = 5.1.12, puoi controllare questa opzione a livello globale in fase di esecuzione:

  1. Eseguire SET GLOBAL log_output = 'TABLE';
  2. Eseguire SET GLOBAL general_log = 'ON';
  3. Dai un'occhiata al tavolo mysql.general_log

Se si preferisce l'output in un file anziché in una tabella:

  1. SET GLOBAL log_output = "FILE"; il valore predefinito .
  2. SET GLOBAL general_log_file = "/path/to/your/logfile.log";
  3. SET GLOBAL general_log = 'ON';

Preferisco questo metodo alla modifica dei file .cnf perché:

  1. non stai modificando il my.cnffile e potenzialmente accendendo in modo permanente la registrazione
  2. non stai pescando nel filesystem cercando il log delle query - o peggio ancora, distratto dalla necessità della destinazione perfetta. /var/log /var/data/log /opt /home/mysql_savior/var
  3. Non è necessario riavviare il server e interrompere qualsiasi connessione corrente ad esso.
  4. il riavvio del server ti lascia da dove hai iniziato (il registro è di default ancora spento)

Per ulteriori informazioni, consultare il Manuale di riferimento di MySQL 5.1 - Variabili di sistema del server - general_log


4
Ottimo design dell'interfaccia utente. Ad ogni modo, le tabelle di log di MySQL stanno effettivamente utilizzando il motore CSV, quindi puoi fare tutto ciò che FlipMcF ha detto nella risposta sull'abilitazione della registrazione nella tabella general_log e avere tail -f di general_log in questo modo: tail -f / var / lib / mysql / mysql / general_log.CSV

2
accidenti, il documento mysql per questo non ha nemmeno sparato il parametro della tabella. molte grazie.
Abhishek Dujari,


6
ricordati di cancellare la tabella di registro generale quando hai finito: "tronca la tabella mysql.general_log"
pdwalker

1
Ho ottenuto il risultato in questo modo, ma i parametri sono presenti per punto interrogativo, ad esempio selezionare foo dalla barra dove x = ?. Come posso ottenere la query completa?
Okwap

43

È possibile abilitare un registro delle query generale per quel tipo di diagnostica. In genere, tuttavia, non si registrano tutte le query SELECT su un server di produzione, è un killer delle prestazioni.

Modifica la tua configurazione MySQL, ad esempio /etc/mysql/my.cnf - cerca o aggiungi una linea come questa

[mysqld]
log = /var/log/mysql/mysql.log

Riavvia mysql per raccogliere quel cambiamento, ora puoi farlo

tail -f /var/log/mysql/mysql.log

Ehi presto, puoi guardare le domande appena arrivano.


4
general_log_file e general_log nel mio my.cnf
Martin Thoma,


1
Le versioni più recenti di Mac OS X (almeno su Mac OS X) richiedono le opzioni general_log_file e general_log anziché solo "log =". Altrimenti, viene visualizzato un errore simile al seguente: ERRORE / usr / local / mysql / bin / mysqld: opzione ambigua '--log = / tmp / mysql_queries.log' (log-bin, log_slave_updates)
Jay Sheth,

@JaySheth, ho riscontrato quell'errore su Mariadb 10.2, quindi non sono sicuro che sia legato solo a Mac OS.
user10089632

16

Puoi fare ciò che scorre per monitorare i log delle query mysql.

Apri il file di configurazione mysql my.cnf

sudo nano /etc/mysql/my.cnf

Cerca le seguenti righe sotto [mysqld]un'intestazione e decommenta queste righe per abilitare il registro

general_log_file        = /var/log/mysql/mysql.log
general_log             = 1

Riavvia il tuo server mysql per riflettere le modifiche

sudo service mysql start

Monitorare il registro del server mysql con il seguente comando nel terminale

tail -f /var/log/mysql/mysql.log

15
SELECT * FROM  mysql.general_log  WHERE command_type ='Query' LIMIT total;

9

1) Se la registrazione mysql generale è abilitata, possiamo controllare le query nel file di registro o nella tabella in base a ciò che abbiamo menzionato nella configurazione. Verifica cosa è abilitato con il seguente comando

mysql> show variables like 'general_log%';
mysql> show variables like 'log_output%';

Se abbiamo bisogno della cronologia delle query nella tabella, allora

Execute SET GLOBAL log_output = 'TABLE';
Execute SET GLOBAL general_log = 'ON';

Dai un'occhiata alla tabella mysql.general_log

Se si preferisce l'output in un file:

SET GLOBAL log_output = "FILE"; which is set by default.
SET GLOBAL general_log_file = "/path/to/your/logfile.log";
SET GLOBAL general_log = 'ON';

2) Possiamo anche controllare le query nel file .mysql_history cat ~ / .mysql_history



4

Se mysql binlog è abilitato, puoi controllare i comandi eseguiti dall'utente eseguendo il seguente comando nella console di linux passando alla directory mysql binlog

mysqlbinlog binlog.000001 >  /tmp/statements.sql

abilitare

[mysqld]
log = /var/log/mysql/mysql.log

o il registro generale avrà un effetto sulle prestazioni di mysql


possibile, ma doloroso. più utile se stai cercando di vedere cosa è successo in passato.
pdwalker,


2

Dopo aver letto la risposta di Paul, ho continuato a scavare per ulteriori informazioni su https://dev.mysql.com/doc/refman/5.7/en/query-log.html

Ho trovato un codice davvero utile per una persona. Ecco il riassunto del contesto.

(Nota: il seguente codice non è mio)

Questo script è un esempio per mantenere pulita la tabella che ti aiuterà a ridurre le dimensioni della tabella. Come dopo un giorno, ci saranno circa 180k query di log. (in un file, sarebbe 30 MB al giorno)

È necessario aggiungere una colonna aggiuntiva (event_unix) e quindi è possibile utilizzare questo script per mantenere pulito il registro ... aggiornerà il timestamp in un timestamp Unix, eliminerà i log più vecchi di 1 giorno e quindi aggiornerà event_time in Timestamp da event_unix ... sembra un po 'confuso, ma funziona alla grande.

Comandi per la nuova colonna:

SET GLOBAL general_log = 'OFF';
RENAME TABLE general_log TO general_log_temp;
ALTER TABLE `general_log_temp`
ADD COLUMN `event_unix` int(10) NOT NULL AFTER `event_time`;
RENAME TABLE general_log_temp TO general_log;
SET GLOBAL general_log = 'ON';

Script di pulizia:

SET GLOBAL general_log = 'OFF';
RENAME TABLE general_log TO general_log_temp;
UPDATE general_log_temp SET event_unix = UNIX_TIMESTAMP(event_time);
DELETE FROM `general_log_temp` WHERE `event_unix` < UNIX_TIMESTAMP(NOW()) - 86400;
UPDATE general_log_temp SET event_time = FROM_UNIXTIME(event_unix);
RENAME TABLE general_log_temp TO general_log;
SET GLOBAL general_log = 'ON';

Il merito va a Sebastian Kaiser (autore originale del codice).

Spero che qualcuno lo troverà utile come ho fatto io.


Interessante. Ti mancheranno le query durante la pulizia a meno che tu non abbia bloccato prima tutti i db. Ci sono altri problemi che possono sorgere qui. Se siamo a questo punto della registrazione "continua", utilizzerei la registrazione dei file o il registro bin e un rotatore di registro standard.
FlipMcF

1

Puoi guardare quanto segue in Linux

cd /root

ls -al

vi .mysql_history Potrebbe essere d'aiuto


6
Sembra che funzionerebbe solo per il client mysql ufficiale della riga di comando e solo per le query eseguite dall'utente root
golimar

La domanda dice "tutto il server" che rende questa risposta errata. Ciò mostrerebbe tutte le query eseguite da un singolo client.
FlipMcF

Se mysql binlog è abilitato, puoi controllare i comandi eseguiti dall'utente eseguendo il seguente comando nella console linux passando alla directory mysql binlog mysqlbinlog binlog.000001> /tmp/statements.sql abilitando [mysqld] log = / var / log / mysql / mysql.log o log genrale avranno un effetto sulle prestazioni di mysql
Avinash Singh,

Alcune voci in questo sono comunque eliminate per impostazione predefinita, ad esempio stringhe contenenti "password".
mckenzm,
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.