2012-06-05 13 views
11

¿Hay alguna manera de habilitar el registro de consultas generales de MySQL a través de JDBC? Lo más parecido que he encontrado a través de mi búsqueda es la capacidad de registrar consultas lentas a través de JDBC (http://dev.mysql.com/doc/refman/5.5/en/connector-j-reference-configuration-properties.html). Tal vez debería hacer eso y establecer el umbral de consulta lenta en 0 ms?Habilitación del registro de consultas generales de MySQL con JDBC

Me gustaría registrar todas las consultas a través de MySQL en un formato legible por humanos y me gustaría especificar la ubicación donde debe escribirse el archivo de registro. Sé que daré un golpe de rendimiento, pero mi aplicación solo tiene un usuario y es lo suficientemente simple que me sorprendería si el golpe de rendimiento fuera notable. Me gustaría probarlo de todos modos para ver.

Creo que otra opción que tengo es activar el registro binario y usar mysqlbinlog para convertir los registros binarios a un formato legible para las personas, pero parece que el registro general de consultas proporcionaría un medio más simple para obtener lo que quiero.

Respuesta

3

Terminé encontrando una solución. Hago posible el registro de consultas generales de MySQL a través de Java modificando las variables del sistema global de MySQL en tiempo de ejecución con las siguientes consultas SQL.

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

Recomiendo el uso de barras diagonales en la ruta general_log_file. No pude hacer que las barras diagonales funcionaran, incluso en un entorno Windows.

Deshabilito el registro general de consultas en tiempo de ejecución con la siguiente consulta SQL.

SET GLOBAL general_log='OFF' 
3

Si está utilizando Hibernate y realiza todo el acceso a datos a través de él, puede activar el registro estableciendo la propiedad hibernate.show_sql en verdadero. Sin embargo, esto escribirá enunciados parametrizados (por ejemplo, SELECT foo.id FROM foo WHERE foo.bar = ?). Si necesita valores de parámetros, o no utiliza una herramienta como Hibernate, es posible que necesite tener MySQL para escribir este registro. Consulte la documentación de MySQL en el general query log.

FWIW, el registro binario de MySQL es un medio para un fin diferente; registra cambios en los datos y se usa para copias de seguridad incrementales y/o replicación. SELECT las declaraciones no se registran en el registro binario.

EDIT: yo era capaz de obtener MySQL para escribir el registro general mediante la adición de las dos líneas siguientes a my.cnf (después de confirmar ni variables ya estaba establecido), y reiniciar MySQL:


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

Eric, no he visto una página de documentación oficial por MySQL que era comprensible, siempre, y lo he usado durante 5 años. Puedo ser muy específico señalando la ambigüedad en esa página. ¿Puedes mostrar una consulta de ejemplo para activar el registro general de consultas? No sé si uso hibernate, tampoco. Sin embargo, si pudieras decirme cómo verificar eso, podría decírtelo. –

25

puede habilitar el registro en la URL JDBC como esto:

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

Otros backends de registro están disponibles (CommonsLogger, Slf4jLogger, JDK14Logger). Creo que el registro directo de Log4J se eliminó en algún momento debido a problemas de licencia, por lo que podría no funcionar con su versión del controlador JDBC.

Naturalmente, necesitará el JAR de la biblioteca de registro relevante en su classpath, y un archivo de configuración (log4j.properties). Primero establecería el nivel de raíz en TRACE para ver qué sucede y ajustarlo por nivel de registro y categoría una vez que vea lo que se está registrando.

Más información:

HTH

+0

¡Gracias! Esto es realmente cuando se utilizan marcos de blackbox/fuente cerrada que no admiten fácilmente agregar argumentos de registro –

6

Add 'logger' y 'profileSQL' a la URL de JDBC:

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

por lo que recibirá la instrucción SQL a continuación:

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 

El registrador por defecto es:

com.mysql.jdbc.log.StandardLogger 

Mysql lista de propiedades JDBC: https://dev.mysql.com/doc/connector-j/en/connector-j-reference-configuration-properties.html

Cuestiones relacionadas