Sunday, October 12, 2014

MySQLのスローログのローテーション

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

異なるクライアントでの作業中に、私は時々非常に大規模なスローログファイルを渡って実行するために起こる。 が、それらを回転させるべきかについて、いくつかの意見が存在する。 これらの意見の多くは、私も自分のバイナリログをフラッシュすることを好まない、ログローテートとフラッシュlogsコマンドを使用します。 私はロナルドブラッドフォードに同意するのはこのためですブログ投稿これを行う方法上の年前から。 
私は少しさらにそれを撮影し手順をスクリプト化している。 bashスクリプトは、MySQL 5.6で構築されており、心の中mysql_config_editorはそれは同様にMySQLの古いバージョンで使用することができます。 

このスクリプトは、次の操作を行います。 
  • 現在のログファイル名を収集します
  • 現在の長いクエリ時間値を収集
  • 高い値に長いクエリ時間をリセットします
  • ログは同様にそれを切り捨て中にコピー(ロナルドさんの投稿を参照してください)
  • 元の時間に戻って長いクエリ時間をリセットします
  • ご希望の場合は、新しいスローログを確認することができますので、簡単なスロークエリを実行します
  • あなたが戻ってスペースを得ることができますので、古い低速のログを削除します。
    • あなたが代わりにログを確認したい場合は、このコマンドをコメントアウトすることができます。
だから、すべての動作しますか? 
さて私たちは、この例を使用してみましょう。 

私は現在、私はそれに応じて、スクリプトを更新した形で書きファイルに上書きmysql_config_editorを使用しています。 
# mysql_config_editor print --all 
[local] 
user = root 
password = ***** 
host = localhost 

私は、このスロークエリログが現在1Gであることがわかります。 
# ls -alh mysql-slow.log 
-rw-rw---- 1 mysql mysql 1.1G Oct 11 16:08 mysql-slow.log 

だから私は、スクリプトを実行する 
# /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]を、それが働いたと私は私のビンのログをフラッシュするか、MySQLを再起動せずに今では小さなログファイルを持っている。 

あなたができるだけ頻繁にあなたがしたいように回転させることができますので、このスクリプトは、crontabのに追加することができます。 

ここではスクリプトです。 
#!/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;