sábado, 11 de outubro de 2014

Girando MySQL Logs lentas

Original post: http://anothermysqldba.blogspot.com/2014/10/rotating-mysql-slow-logs.html

Ao trabalhar com diferentes clientes acontecer de eu correr em grandes arquivos de log lento ao longo do tempo. Embora existam várias opiniões sobre como eles devem ser rodados. Muitas dessas opiniões usar rotação de log eo comando liberar registros, prefiro não liberar meus logs binários embora. É por isso que eu concordo com o Ronald Bradford blog de ​​anos atrás sobre como fazer isso. 
Tomei um pouco mais longe e roteirizado os passos. O script bash é construído com o MySQL 5.6 eo mysql_config_editor em mente que pode ser usado em versões mais antigas do MySQL também. 

O script fará o seguinte: 
  • Reúna atual nome do arquivo de log
  • Reúna valor de tempo de consulta longa corrente
  • Reinicia o tempo de consulta muito tempo para um valor mais alto
  • Copia o log enquanto truncando-lo também (ver post do Ronald)
  • Reinicia o tempo de consulta tempo de volta ao horário original
  • Executa uma consulta simples lento para que possa verificar o novo registro lento, se desejar
  • Remove o registro mais antigo lento para que você possa ganhar espaço de volta.
    • Você pode comentar este comando se você quiser rever o log em seu lugar.
Assim é que tudo funciona? 
Bem, vamos usar esse exemplo. 

Atualmente estou usando o mysql_config_editor sobre um arquivo .my.cnf então eu atualizei o script de acordo. 
# mysql_config_editor print --all 
[local] 
user = root 
password = ***** 
host = localhost 

Eu posso ver que este log de consultas lentas é agora 1G. 
# ls -alh mysql-slow.log 
-rw-rw---- 1 mysql mysql 1.1G Oct 11 16:08 mysql-slow.log 

Então eu executar o script 
# /root/rotate_slow_logs.sh 
# ls -alh mysql-slow.log 
-rw-rw---- 1 mysql mysql 5.8K Oct 11 16:11 mysql-slow.log 

Ok bom, funcionou e eu tenho um arquivo de log menor agora sem limpar meus logs bin ou reiniciar o MySQL. 

Este script pode ser adicionado a um crontab para que você possa rodar tão frequentemente como você gostaria. 

Aqui está o script. 
#!/bin/bash 

# THIS IS BUILT WITH MYSQL 5.6 SECURITY IN MIND. 
# SET THE LOGINPATHVALUE if you are using the mysql_config_editor 
# IF YOU ARE NOT USING THE mysql_config_editor THEN IT IS ASSUMED YOU HAVE 
# SET A .my.cnf FILE IN THE USER HOME DIR OR THIS USER HAS NO PASSWORD SET 


# PLEASE SET THIS ACCORDINGLY TO YOUR SYSTEM. 
LOGINPATHVALUE="local"; 

if [ -z "${LOGINPATHVALUE}" ]; then 
LOGINPATH=""; 
fi 

if [ -n "${LOGINPATHVALUE-unset}" ]; then 
LOGINPATH="--login-path=$LOGINPATHVALUE " 

fi 

# GATHERS THE LOG FILE NAME 
SLOWLOG=$(mysqladmin $LOGINPATH variables | grep slow | grep file | awk '/[a-zA-Z]/ {print $4}' ) 

# GATHER CURRENT VALUE 
LQT=$( mysqladmin $LOGINPATH variables | grep long_query_time | awk '/[0-9]./ {print $4}' ) 
LQTB=$(mysql $LOGINPATH -e " SELECT @@global.long_query_time *200 AS LQTB;" | awk '/[0-9]./ {print $1}' ) 
LQTC=$(mysql $LOGINPATH -e " SELECT @@global.long_query_time *2 AS LQTC;" | awk '/[0-9]./ {print $1}' ) 

# GATHER MARKER 
DATE=`date +"%m%d%Y"` 

# RESET SLOW QUERY TIME 
# SET GLOBAL long_query_time=10; 
mysql $LOGINPATH -e "SET GLOBAL long_query_time= $LQTB" 

LQTD=$( mysqladmin $LOGINPATH variables | grep long_query_time | awk '/[0-9]./ {print $4}' ) 

#MOVE THE LOG OUT 
cp $SLOWLOG $SLOWLOG.$DATE; > $SLOWLOG 

#SET THE TIMEBACK 
mysql $LOGINPATH -e "SET GLOBAL long_query_time= $LQT" 

LQTD=$( mysqladmin $LOGINPATH variables | grep long_query_time | awk '/[0-9]./ {print $4}' ) 

#PLACE A Slow query for log 
SLOWQUERY=$(mysql $LOGINPATH -e "SELECT sleep($LQTC) " ) 

# REMOVE OLD LOG 
/bin/rm -f $SLOWLOG.$DATE;