Bienvenidos sean a este post, hoy continuaremos con la saga de los logs.
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.
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
y para desactivarlo debemos usar:
--general_log=0
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>
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
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;
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
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
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
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
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)
Esta es una forma mas practica de como poder mantener un control de todo lo ejecutado en nuestro servidor.
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.


Donación
Es para mantenimento del sitio, gracias!
$1.50
