Limpieza y rotación del slow-query-logs

2 Septiembre 2013 at 15:33 by Adrián Pérez

cleanupYa hablamos de cómo limpiar de forma segura el error-log de MySQL. Otro fichero de logs que puede dar problemas, si lo tenemos activado, es el slow_query_log, que se encarga de almacenar las queries que se han ejecutado sin índices, o que han tardado más de determinados segundos en ejecutarse. Este fichero, por tanto, nos debería servir para identificar puntos de mejora en nuestras queries, pero si tenemos mucho que mejorar, se llenará rápidamente. En mysqlperformanceblog explican cómo crear un script para uso de logrotate para limpiar de forma automática este log de forma periodica, y evitar así problemas mayores.

Primero, crearemos el script de rotación, cogido directamente de mysqlperformanceblog:

[root@myserver]# vi /etc/logrotate.d/mysql-slow

/var/lib/mysql/mysql-slow.log {
nocompress
create 660 mysql mysql
size 1G
dateext
missingok
notifempty
sharedscripts
postrotate
/usr/bin/mysql -u logrotate -pmipassword -e 'select @@global.long_query_time into @lqt_save; set global long_query_time=2000; select sleep(2); FLUSH SLOW LOGS; select sleep(2); set global long_query_time=@lqt_save;'
endscript
rotate 5
}

Se ha de tener en cuenta, que en la instrucción de postrotate, necesitaremos añadir el usuario y password de acceso al mysql para poder ejecutar esas consultas. También se deberá indicar la ruta al fichero del slow-log en la primera instrucción (marcado en negrita).

Para evitar usar el usuario "root" o un usuario con demasiados permisos, podemos crear un usuario mysql específico para ejecutar esta instrucción. El usuario necesitará los permisos de SELECT, FILE (para el "select ... into"), SUPER (para los "set global") y RELOAD (para el "flush slow logs"). Así, podremos crear el usuario que ejecutará la instrucción tal y como sigue:

mysql> create user 'logrotate'@'localhost' identified by 'mipassword';
mysql> grant select,file,super,reload on *.* to 'logrotate'@'localhost';
mysql> flush privileges;

Una vez tengamos listo el script, podremos probarlo ejecutando:

[root@myserver]# logrotate -vf /etc/logrotate.d/mysql-slow

Ésto ejecutará el logrotate únicamente para el script que acabamos de crear, y por tanto, rotará únicamente nuestro slow-log, sin afectar al resto de ficheros de log del logrotate. Si todo va bien, se habrá generado un nuevo fichero slow-log de 0 bytes, donde se empezarán a registrar los logs de las queries lentas, permitiéndonos, si así lo queremos, mover o eliminar el antiguo fichero de slow-logs que se habrá renombrado.

Además, quedará configurada la rotación automática y en principio, ya no tendremos que preocuparnos de volver a ejecutar manualmente el logrotate, puesto que se ejecutará de forma periodica.

Fuente:

http://www.mysqlperformanceblog.com/2013/04/18/rotating-mysql-slow-logs-safely/

Flickr! Foto por emilydickinsonridesabmx