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... 
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