Anuncios

Bienvenidos sean a este post, hoy continuaremos con la saga de los logs.

Anuncios
Anuncios

Hasta ahora hemos hablado del log de errores y de sistemas pero hoy nos centraremos en aquel que se encarga de llevar un control sobre todos los queries en el servidor, se escriben en el mismo orden que se reciben aunque en entornos multithreads no se respeta el orden de ejecucion debido a la espera de los bloqueos (locks), tambien se almacenan los conexiones y desconexiones, y este tambien es util para descubrir bugs o errores de aplicaciones.

Anuncios

Si bien el log general esta adaptado para ser leido por humanos, este log en cambio depende del formato del log binario (binlog), dado que necesitamos que sea leido por programas para cuando entremos en problemas de lo cual hablaremos mucho mas adelante, para poder activar este log debemos usar el siguiente modificador:

--general_log
Anuncios

y para desactivarlo debemos usar:

--general_log=0
Anuncios

Si bien esta desactivado de manera predeterminada podemos activarlo con las opciones anteriores o tambien con la variable interna del sistema llamada general_log, si esta activado se almacena de manera predeterminada en un archivo, este se compone del nombre del host con la extension .log en el directorio de los datos, pero en caso de necesitar hacerlo en otra ubicacion usaremos la siguiente opcion:

--general_log_file=<archivo>
Anuncios

Si bien la opcion –log_output determina la salida de ambos logs (error y general de queries) y nos permite tres tipos de valores que pueden ser combinados en muchas formas, estos valores son:

  • FILE, es para almacenar en archivos
  • TABLE, se usa una tabla para almacenarlas
  • NONE, no se efectua el seguimiento del log
Anuncios
Anuncios

Tambien existe una variable del sistema llamada log_output que nos permite cambiar este valor de manera dinamica, permitiendo cambiar la salida del mismo en el momento de ejecucion, al ser global su cambio afecta a todas las sesiones y no solo a la actual, pero en algunas oportunidades algun superusuario (root) puede necesitar desactivar los logs de manera temporal, una de las razones principales puede ser para no registrar un cambio de password en un archivo de texto o tabla, es un poco riesgoso, por esta u otra razon el root puede desactivar el log general de queries y de queries lentos simplemente seteando la variable del sistema llamada sql_log_off con el valor de 1 en la sesion actual de la siguiente forma:

SET @@session.sql_log_off=1;
Anuncios

Esta variable existe tanto en la parte global como local y nos permite desactivar temporalmente los queries pero siempre y cuando sea necesario por alguna razon, pasemos a hablar un poco sobre el formato del archivo por lo general comienza con esta estructura:

/usr/sbin/mysqld, Version: 10.3.29-MariaDB-0+deb10u1 (Debian 10). started with:
Tcp port: 3306  Unix socket: /run/mysqld/mysqld.sock
Time		    Id Command	Argument
Anuncios

La primera linea nos informa donde esta el archivo del daemon, los datos del servidor, luego los puertos y sockets de conexion y por ultimo las columnas de los datos que se almacenaran, veamos un ejemplo de que se puede guardar:

140103 18:14:47      4  Query    SHOW TABLES
Anuncios
Anuncios

Observen que primero pasamos la fecha y hora en el formato YYMMDD (Año dos digitos, mes, dia), luego tenemos el id de la conexion al servidor, cual es el tipo de comando que se ejecuto y por ultimo vemos cual es el comando ejecutado, en este tendremos todos los comandos que se ejecuten en el cliente inclusive los relacionados a la desconexion del mismo, les paso un ejemplo:

140103 18:14:57        4 Quit
Anuncios

Este puede ser la ejecucion del comando logout, quit o simplemente presionamos Ctrl+D, todos nos desconectan del servidor por lo tanto se almacena como lo ejecutado en este caso al ser una salida muestra a Quit pero no pasa argumento porque sale automaticamente y nosotros no es un dato que necesitemos sino simplemente cuando salio, por ultimo tenemos la tabla general_log en la base mysql, esta posee las siguientes columnas:

  • event_time, se almacena la fecha y hora del evento
  • user_host, aqui se almacena la cuenta que ejecuto el comando
  • thread_id, aqui ira el id de la conexion
  • server_id, aqui se almacena el id del servidor desde donde lo ejecutamos
  • command_type, aqui se almacena el tipo de comando que ejecutamos (ej: Query)
  • argument, aqui se almacena el comando que se envia como descripcion
Anuncios

Como pueden ver se almacenan todos los valores que vimos anteriormente pero con el adicional del id del servidor, veamos un ejemplo simple de como almacena los datos:

MariaDB [mysql]> SELECT * FROM general_log ORDER BY event_time DESC LIMIT 1 \G
*************************** 1. row ***************************
  event_time: 2014-06-17 08:34:25.864270
   user_host: root[root] @ localhost []
   thread_id: 4
   server_id: 1
command_type: Query
    argument: SET @@session.sql_log_off = 1
1 row in set (0.01 sec)
Anuncios

Esta es una forma mas practica de como poder mantener un control de todo lo ejecutado en nuestro servidor.

Anuncios

En resumen, hoy hemos visto el log general de queries, como es, para que se usa, como podemos utilizarlo, sus posibles salidas, un ejemplo de como es el archivo y finalmente la tabla general_log, espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios

Donación

Es para mantenimento del sitio, gracias!

$1.50