Activar log de MySQL almacenándolo en base de datos

Hoy me he estado acordando de cierto argentino que iba de profesional, resulta que una serie de páginas que muestran estadísticas van a pedales y cuando les he echado un vistazo me encuentro que llegaba en ocasiones a dar cascar la base de datos.

Como es una web montada con PHP a pelo y de aquella forma, la opción más rápida para ver que consultas se ejecutaban y cuales daban problemas, ha sido activar el log de MySQL (y cuando ves que hay consultas que tardan más de 5 segundos es que hay un problema….).

Primero avisar que hay dos tipos de log:

  • general_log: que muestra cuando se ha ejecutado una consulta, usuario que ejecuta la consulta , el hilo de ejecución (útil por si tienes que matarlo porque se ha quedado pillado), el servidor, el tipo de consulta y la consulta ejecutada.
  • slow_log: que muestra cuando se ha empezado a ejecutar la consulta, el usuario que ejecuta la consulta, el tiempo de ejecución, tiempos de bloqueo, número de registros devueltos, número de registros donde se han buscado los resultados, la base de datos donde se ha ejecutado, ultimo id insertado, id insertado, el servidor y la consulta ejecutada.

Para activarlos se puede hacer desde el fichero de configuración de MySQL pero también se puede activar desde un cliente de MySQL (con un usuario que tenga permisos) con las siguientes sentencias:

-- Activar el log general:
SET global general_log = 1;

-- Activar el log detallado:
SET global long_query_time = 1;
SET global slow_query_log = 1;

-- Si queremos que los log se almacenen en base de datos en vez de en ficheros de texto:
SET global log_output = 'table';

Al almacenar los logs en base de datos conseguiremos poder consultarlos más fácilmente a parte de no tener que estar buscando el fichero de los logs en el servidor ya que se almacenarar en las tablas general_log y slow_log de la base de datos mysql. Por lo que para consultar los log podríamos hacerlo así:

select * from mysql.general_log;

select * from mysql.slow_log;

Para desactivarlos ejecutaríamos las mismas sentencias que hemos usado para activarlos pero con valor a cero.

PD: importante, si tenéis tablas con muchos registros debéis meter índices en los campos por los que vais a filtrar en las consultas.
PD2: aprender bien SQL, porque hay bastante diferencia entre una consulta con 13 union y sacar los mismos datos con un simple group by…

Dejar un comentario?

0 Comentarios.

Deje un comentario


NOTA - Puede usar estosHTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.