शनिवार, 11 अक्तूबर 2014

MySQL धीरे लॉग घूर्णन

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

विभिन्न ग्राहकों के साथ काम करते हुए मैं समय समय पर बहुत बड़ी धीमी गति से लॉग इन फ़ाइलों भर में चलाने के लिए होता है. वे घुमाया जाना चाहिए पर कई राय मौजूद हैं. इन विचारों से कई हालांकि मैं मेरे द्विआधारी लॉग फ्लश करने के लिए नहीं पसंद करते हैं, लॉग घुमाएँ और फ्लश लॉग आदेश का उपयोग करें.मैं रोनाल्ड ब्रैडफोर्ड के साथ सहमत हैं यही कारण है कि ब्लॉग पोस्ट यह कैसे करना है पर साल पहले से. 
मैं एक छोटे से आगे ले लिया और कदम की पटकथा लिखी है. पार्टी की योजना बनाई स्क्रिप्ट MySQL 5.6 के साथ बनाया गया है और मन में mysql_config_editor यह रूप में अच्छी तरह से MySQL के पुराने संस्करणों पर इस्तेमाल किया जा सकता है. 

स्क्रिप्ट निम्न करना होगा: 
  • मौजूदा लॉग फ़ाइल नाम इकट्ठा
  • वर्तमान लंबे क्वेरी समय मूल्य इकट्ठा
  • एक उच्च मूल्य के लिए लंबे क्वेरी समय रीसेट करता है
  • प्रतियां के रूप में अच्छी तरह से यह छोटा है, जबकि लॉग (रोनाल्ड की पोस्ट देखें)
  • मूल समय के लिए वापस लंबे क्वेरी समय रीसेट करता है
  • यदि आप चाहें तो एक साधारण धीमी क्वेरी ताकि आप नए धीमी लॉग जाँच कर सकते हैं कार्यान्वित
  • आप वापस अंतरिक्ष हासिल कर सकते हैं तो पुराने धीमी लॉग निकालता है.
    • आप के बजाय लॉग की समीक्षा करना चाहते हैं तो आप इस आदेश को बाहर टिप्पणी कर सकते हैं.
तो यह सब काम करता है? 
वैसे हम इस उदाहरण का उपयोग करते हैं. 

मैं तदनुसार स्क्रिप्ट अद्यतन इसलिए मैं वर्तमान में एक .my.cnf फ़ाइल पर 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 

अच्छा ठीक है, यह काम किया है और मैं अपने बिन लॉग निस्तब्धता या 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;


कोई टिप्पणी नहीं:

एक टिप्पणी भेजें