MySQL Log en Linux - Query Log

The General Query Log

 


 

Este tipo de log registra todas las conecciones / desconecciones, así como también todos las sentencias recibidas por parte de los clientes.

Estas sentencias son registradas en el orden en el cual llegan al motor, no en el orden en que son ejecutadas, con lo cual en algunos casos puede diferir el orden de registro con el de su ejecución en el motor.

Su ubicación por defecto es el "data directory", para obtener este dato podemos correr el siguiente comando.

achiola@achiola-laptop:/var/log$ cat /etc/mysql/my.cnf | grep datadir
datadir		= /var/lib/mysql

 

Como ya dije antes, me gusta que todos los log esten en sus respectivos archivos y en lo posible todos juntos, por lo tanto voy a cambiar la ubicación por defecto a otra ubicación que me sea mas facil de encontrar y recordar, lo voy a poner en /var/log/mysql.

Para estoy hay que editar my.cnf ( esta en /etc/mysql ) y le agregamos la siguiente linea

log		= /var/log/mysql/mysql.log

 

con lo cual debería quedar algo como esto:

[mysqld]
#
# * Basic Settings
#

#
# * IMPORTANT
#   If you make changes to these settings and your system uses apparmor, you may
#   also need to also adjust /etc/apparmor.d/usr.sbin.mysqld.
#

user		= mysql
pid-file	= /var/run/mysqld/mysqld.pid
socket		= /var/run/mysqld/mysqld.sock
port		= 3306
basedir		= /usr
datadir		= /var/lib/mysql
tmpdir		= /tmp
log-error	= /var/log/mysql/mysql.err
log		= /var/log/mysql/mysql.log
skip-external-locking

 

reiniciamos mysql

sudo /etc/init.d/mysql stop
 * Stopping MySQL database server mysqld  

sudo /etc/init.d/mysql start
 * Starting MySQL database server mysqld
 * Checking for corrupt, not cleanly closed and upgrade needing tables.

 

 

y ya podemos ver los log en la nueva ubicación.

achiola@achiola-laptop:/var/log/mysql$ l
total 16K
-rw-rw---- 1 mysql adm 458 2009-06-27 17:31 mysql.err
-rw-rw---- 1 mysql adm   0 2009-06-27 16:52 mysql.err-old
-rw-rw---- 1 mysql adm 11K 2009-06-27 17:31 mysql.log

 

 

Este tipo de log es muy util cuando necesitamos saber que esta haciendo nuestra aplicación (cuando se conecta a la db que sentencias corre, etc), para un ejemplo sensillo veamos de forma "manual" que información obtenmos.

Lo primero que vamos a hacer es abrir una ventana  terminal, e ir hasta nuestro directorio donde tenemos el mysql.log y vamos a dejar corriendo un comando tailf, como el siguiente

achiola@achiola-laptop:/var/log/mysql$ tailf mysql.log 
		    267 Query       select count(*) into @discard from `mysql`.`user`
		    267 Quit       
090627 17:31:46	    268 Connect     debian-sys-maint@localhost on 
		    268 Query       select @@version_comment limit 1
		    268 Query       select count(*) into @discard from `mysql`.`user_info`
		    268 Quit       
		    269 Connect     debian-sys-maint@localhost on 
		    269 Query       select @@version_comment limit 1
		    269 Query       select count(*) into @discard from `pruebas`.`t1`
		    269 Quit       

 

En otro terminal vamos a conectarnos a mySQL y empezaremos a ver que pasa con el log

achiola@achiola-laptop:/var/lib/mysql$ mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 270
Server version: 5.0.75-0ubuntu10.2-log (Ubuntu)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> 

 

Si nos fijamos en el tailf debería aparecerte algo por el estilo.

090627 17:35:57	    270 Connect     root@localhost on 
		    270 Query       select @@version_comment limit 1

 

Indicando que el usuario root se ha conectado al motor.

Ahora veamos que pasa cuando se "conecta" a una db en particular, en mi caso voy a utilizar la db amarok, sino conoces el reproductor amarok, te lo recomiendo... Laughing

 

Veamos que pasa, volvamos a nuestra conección con la db y seleccionamos la db amarok.

mysql> use amarok;
Database changed

 

Y veamos que paso en el log

090627 17:47:18	    272 Query       SELECT DATABASE()
		    272 Init DB     amarok

 

perfecto, nuestro log nos esta informado la conección, ahora veamos que pasa cuando ejecutamos una consulta.

mysql> select * from year;
+----+------+
| id | name |
+----+------+
|  1 | 1992 | 
|  2 | 0    | 
|  3 | 2001 | 
|  4 | 1996 | 
|  5 | 1986 | 
|  6 | 1997 | 
|  7 | 2002 | 
|  8 | 2003 | 
+----+------+
8 rows in set (0.00 sec)

 

y el log nos indica...

090627 17:53:31	    272 Query       select * from year

 

de esta forma podemos rastrear lo que hace nuestra app cuando se conecta al motor de base de datos. Es tipo de log NO "marcan" los errores de sintaxis, por ejemplo si hacemos un query a una tabla inexistente como la siguiente:

mysql> select * from estaTablaNoExiste;
ERROR 1146 (42S02): Table 'amarok.estaTablaNoExiste' doesn't exist

 

mysql nos devuelve un error, pero, si miramos el log nos dice.

090627 18:02:57	    272 Query       select * from estaTablaNoExiste

 

en fin, no nos aparece el error, simplemente nos dice que alguien a efectuado un select a la tabla estaTablaNoExiste.

Como leer el log? muy simple, suponiendo el siguiente mensaje. "090627 17:53:31        272 Query       select * from year"

  • 090627 17:53:31 --> nos indica la fecha y hora
  • 272: id
  • Query: Comando, o tipo de acción
  • select * from year: es el argumento

 

 


En la versión 5.1 de mySQL es posble activar y desactivar el "general query log" en tiempo de ejecución con los siguientes comandos.

SET GLOBAL general_log = 'OFF';
SET GLOBAL general_log = 'ON';

 

 


  < Volver a la primera parte > <    Pronto    >

 

 

Comentarios

PID issue

Thanks for this m8, setting up the pid-file param I fixed my problem

:)

Genial

Genial gracias

Enviar un comentario nuevo

El contenido de este campo se mantiene privado y no se mostrará públicamente.
CAPTCHA
This question is for testing whether you are a human visitor and to prevent automated spam submissions.

Tags for MySQL Log en Linux - Query Log