Saturday, October 11, 2014

Rotación de Logs MySQL lentas

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

Al trabajar con diferentes clientes Sucede que correr a través de grandes archivos de registro lento de vez en cuando. Si bien existen varias opiniones sobre la forma en que se deben rotar. Muchas de estas opiniones utilice Girar registro y el comando registros ras, prefiero no para eliminar mis registros binarios sin embargo. Es por esto que estoy de acuerdo con Ronald Bradfordentrada de blog desde hace años sobre la forma de hacer esto. 
Me he tomado un poco más lejos y con guión de los pasos. El script bash se construye con MySQL 5.6 y el mysql_config_editor en cuenta que se puede utilizar en las versiones antiguas de MySQL también. 

El script hará lo siguiente: 
  • Reúna nombre del archivo de registro actual
  • Reúna valor actual tiempo de consulta larga
  • Restablece el tiempo de consulta de largo a un valor más alto
  • Las copias del registro, mientras que truncar así (Ver Nota de Ronald)
  • Restablece el tiempo de consulta larga volver a la hora original
  • Ejecuta una simple consulta lenta para que pueda comprobar el nuevo registro lento si lo desea
  • Elimina el registro más antiguo lenta para que pueda ganar espacio atrás.
    • Puedes comentar este comando si desea revisar el registro de su lugar.
Así lo hace todo el trabajo? 
Bueno vamos a utilizar este ejemplo. 

Actualmente estoy usando el mysql_config_editor sobre un archivo .my.cnf lo he actualizado la secuencia de comandos en consecuencia. 
# mysql_config_editor print --all 
[local] 
user = root 
password = ***** 
host = localhost 

Puedo ver que este registro de consultas lentas es ahora 1G. 
# ls -alh mysql-slow.log 
-rw-rw---- 1 mysql mysql 1.1G Oct 11 16:08 mysql-slow.log 

Así que ejecutar el 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 bueno, trabajado y tengo un archivo de registro más pequeño ahora sin rubor mis registros bin o reiniciar MySQL. 

Este script se puede agregar a un crontab para que pueda girar con tanta frecuencia como le gustaría. 

Aquí está el guión. 
#!/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;