2012-06-05 20 views
11

Esiste un modo per abilitare la registrazione generale delle query MySQL tramite JDBC? La cosa più vicina che ho trovato attraverso la mia ricerca è la possibilità di registrare query lente attraverso JDBC (http://dev.mysql.com/doc/refman/5.5/en/connector-j-reference-configuration-properties.html). Forse dovrei farlo e impostare la soglia di query lenta su 0 ms?Abilitazione del log di query generale MySQL con JDBC

Vorrei registrare tutte le query tramite MySQL in un formato leggibile dall'uomo e desidero specificare il percorso in cui scrivere il file di registro. So che proverò un successo in termini di prestazioni, ma la mia applicazione ha solo un utente ed è abbastanza semplice che sarei sorpreso se il colpo di performance fosse evidente. Mi piacerebbe provarlo comunque per vedere.

Credo che un'altra opzione è quella di attivare la registrazione binaria e utilizzare mysqlbinlog per convertire i registri binari in un formato leggibile dall'uomo, ma sembra che il registro generale delle query possa fornire un mezzo più semplice per ottenere ciò che voglio.

risposta

3

Alla fine ho trovato una soluzione alternativa. Abilito la registrazione generale delle query MySQL tramite Java modificando le variabili di sistema globali MySQL in fase di runtime con le seguenti query SQL.

SET GLOBAL log_output="FILE" 
SET GLOBAL general_log_file="Path/File" 
SET GLOBAL general_log='ON' 

Si consiglia di utilizzare le barre in avanti nel percorso general_log_file. Non sono riuscito a far funzionare i backslash, anche in un ambiente Windows.

Disabilita la registrazione generale delle query in fase di esecuzione con la seguente query SQL.

SET GLOBAL general_log='OFF' 
3

Se si utilizza la modalità di sospensione e si esegue l'accesso a tutti i dati attraverso di essa, è possibile attivare la registrazione impostando la proprietà hibernate.show_sql su true. Ciò scriverà le istruzioni parametrate (ad esempio SELECT foo.id FROM foo WHERE foo.bar = ?), tuttavia. Se hai bisogno di valori di parametro o non usi uno strumento come Hibernate, potresti aver bisogno che MySQL scriva questo registro. Consultare la documentazione MySQL su general query log.

FWIW, il log binario MySQL è un mezzo per un fine diverso; registra le modifiche ai dati e viene utilizzato per backup incrementali e/o replica. Le dichiarazioni SELECT non sono registrate nel registro binario.

EDIT: sono stato in grado di ottenere MySQL di scrivere il registro generale aggiungendo le seguenti due righe di my.cnf (dopo aver confermato nessuna delle due variabili è stata già impostata), e riavviare MySQL:


general_log = 1 
general_log_file=/tmp/mysql-general.log 
+0

Eric, non ho visto una pagina di documentazione ufficiale da MySQL che era comprensibile, mai, e lo sto usando da 5 anni. Posso essere molto specifico indicando l'ambiguità su quella pagina. Puoi mostrare una query di esempio per attivare il registro generale delle query? Non so se uso anche l'ibernazione. Se tu potessi dirmi come controllare, potrei farti sapere, però. –

25

È possibile attivare la registrazione nell'URL JDBC in questo modo:

jdbc:mysql://host/db?logger=com.mysql.jdbc.log.Log4JLogger&profileSQL=true 

Altri backend di registrazione sono disponibili (CommonsLogger, Slf4jLogger, JDK14Logger). Credo che la registrazione diretta di Log4J sia stata abbandonata a causa dei problemi di licenza, quindi potrebbe non funzionare con la tua versione del driver JDBC.

Naturalmente, è necessario il file JAR della libreria di registrazione pertinente nel classpath e un file di configurazione (log4j.properties). Impostare il livello principale su TRACE per vedere cosa sta succedendo e rafforzarlo per livello di registro e categoria una volta che viene visualizzato ciò che viene registrato.

Ulteriori approfondimenti:

HTH

+0

Grazie! Questo è in realtà quando si utilizzano framework blackbox/closed source che non supportano facilmente l'aggiunta di argomenti di registrazione –

6

Add 'logger' e 'profileSQL' per l'url jdbc:

&logger=com.mysql.jdbc.log.Slf4JLogger&profileSQL=true 

Poi si aprirà l'istruzione SQL di seguito:

2016-01-14 10:09:43 INFO MySQL - FETCH created: Thu Jan 14 10:09:43 CST 2016 duration: 1 connection: 19130945 statement: 999 resultset: 0 
2016-01-14 10:09:43 INFO MySQL - QUERY created: Thu Jan 14 10:09:43 CST 2016 duration: 1 connection: 19130945 statement: 999 resultset: 0 message: SET sql_mode='NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES' 
2016-01-14 10:09:43 INFO MySQL - FETCH created: Thu Jan 14 10:09:43 CST 2016 duration: 1 connection: 19130945 statement: 999 resultset: 0 
2016-01-14 10:09:43 INFO MySQL - QUERY created: Thu Jan 14 10:09:43 CST 2016 duration: 2 connection: 19130945 statement: 13 resultset: 17 message: select 1 
2016-01-14 10:09:43 INFO MySQL - FETCH created: Thu Jan 14 10:09:43 CST 2016 duration: 0 connection: 19130945 statement: 13 resultset: 17 
2016-01-14 10:09:43 INFO MySQL - QUERY created: Thu Jan 14 10:09:43 CST 2016 duration: 1 connection: 19130945 statement: 15 resultset: 18 message: select @@session.tx_read_only 
2016-01-14 10:09:43 INFO MySQL - FETCH created: Thu Jan 14 10:09:43 CST 2016 duration: 0 connection: 19130945 statement: 15 resultset: 18 
2016-01-14 10:09:43 INFO MySQL - QUERY created: Thu Jan 14 10:09:43 CST 2016 duration: 2 connection: 19130945 statement: 14 resultset: 0 message: update sequence set seq=seq+incr where name='demo' and seq=4602 
2016-01-14 10:09:43 INFO MySQL - FETCH created: Thu Jan 14 10:09:43 CST 2016 duration: 0 connection: 19130945 statement: 14 resultset: 0 

Il logger di default è:

com.mysql.jdbc.log.StandardLogger 

Mysql elenco di proprietà jdbc: https://dev.mysql.com/doc/connector-j/en/connector-j-reference-configuration-properties.html

Problemi correlati