txt.fabio.com.ar


¿Qué cuernos está pasando en MySQL? Log general en MySQL

Era un bug de esos que a veces podés encontrar fácil pero otras no, porque no era un bug en sí, era un update mal hecho, algo que me seteaba algo que estaba en 1 a un simple 0.

Pero ¿Cómo encontrarlo? No era un error que podía ubicar con un debugger porque, claro, no fallaba nada, había una instrucción ahí que yo había programado hacía años pero no recordaba dónde estaba ni para qué era... Pero tocaba la base de datos.

La solución cabeza de termo: loguear todo, no los errores, los aciertos.

En algún lado estaba la respuesta y como no era parte del código de la aplicación supuse que era parte de las llamadas a la base de datos.

Al menos sabía que a partir de ahí podía dar con la porción del código que disparaba ese query en particular.

En MySQL existen varios logs que se pueden ejecutar pero hay uno que es para que guarde TODO. 

Claro, no es algo que vas a usar en producción en un sitio web activo donde se dan miles de consultas por segundo así que hice lo más prudente.

Creé un server local, una copia exacta de la última base de datos y el código, lo hice funcionar y luego modifiqué un parámetro en particular de MySQL:

SET GLOBAL general_log = 'ON';

Esto le avisa que empiece a guardar TODO lo que se dispara, errores o aciertos, pero hay que indicarle un lugar para guardarlo:

SET GLOBAL general_log_file = "C:\\xampp\\mysql\\general.log";

La info sobre esta función está aquí en el manual.

El log es super completo, es todo lo que uno ejecuta, un query detrás del otro, seteos, etc.

Gracias a esto di con el query maldito:

Query UPDATE ldv_link SET portada = 0, fecha_portada = CURRENT_TIMESTAMP where id_link = '21844

Ese "set portada = 0" estaba mal, esto era un query de los Links de Viernes, así que busqué la maldita línea donde armaba ese query y me di cuenta que era algo que había preparado para una circunstancia en particular de otra época.

Una de esas líneas de hace años que nunca más revisé :D , la comenté, agregué info para qué era y listo, tema resuelto.

Como uno no quiere llenar megas y megas de logs por cada boludez, se desactiva con un simple:

SET GLOBAL general_log = 'OFF';


A veces la solución es mucho más rápida y sencilla de lo que imaginamos, está ahí, no hace falta usar un debugger complejo ni ir paso a paso, con esto salteé un día entero de investigar y di con el culpable en pocos minutos.


Volver al inicio Ver original