MySQL慢日誌監控指令碼執行個體剖析

來源:互聯網
上載者:User

標籤:http   io   ar   os   使用   sp   for   檔案   div   

   公司線上的 MySQL 慢日誌,之前一直沒有做好監控。趁著上周空閑,我就把監控指令碼寫了下,今天特地把代碼發出來與51博友分享一下。

       針對指令碼的註解和整體構思,我會放到指令碼之後為大家詳解。

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 #!/bin/bash## 本指令碼用來在指定頻率內監控 MySQL 慢日誌的變化,並在發生增長時及時警示# Written by sunsky# Mail : [email protected]# Date : 2014-11-17 10:00:00#  MON_FILE="$2"   # 指定所要監控的指令碼路徑SEC=60          # 指定所要監控的頻率,即間隔多久去查看一次MON_POINT_FILE=/tmp/mon_mysql_slow.point  # 指定MySQL慢日誌的監控點存放的路徑DIFF_MON_FILE=/tmp/mon_mysql_slow.log     # 指定在監控頻率內增加的MySQL慢日誌資訊存放路徑[email protected]            # 指定發送給哪個管理員 function USAGE {    echo -e "\033[31m指令碼名稱: \033[37m"    echo "    $0"    echo -e "\033[31m文法結構: \033[37m"    echo "    $0 {start|stop|restart} MySQL慢記錄檔路徑"    echo -e "\033[31m使用範例: \033[37m"    echo "    $0 start /usr/local/mysql/log/mysql_slow.log"    echo "    $0 stop"    echo "    $0 restart /usr/local/mysql/log/mysql_slow.log"    echo -e "\033[31m注意事項: \033[37m"    echo "    1. 除了stop操作,start和restart操作時,\$2 參數不可為空"    echo "    2. \$2 參數指定的檔案必須存在"    exit 2} function start {    echo "MySQL慢日誌監控進程已經啟動,監控檔案為 $MON_FILE ,監控頻率為 ${SEC}s一次."    while :    do        [ -f $MON_POINT_FILE ] || echo 0 > $MON_POINT_FILE        NEW_POINT=$(awk ‘END{print NR}‘ $MON_FILE)        OLD_POINT=$(<$MON_POINT_FILE)        [[ -z $OLD_POINT ]]&&OLD_POINT=0        SUM_POINT0=$(($NEW_POINT-$OLD_POINT))        SUM_POINT=${SUM_POINT0#-}        tail -$SUM_POINT $MON_FILE > $DIFF_MON_FILE        if [[ -s $DIFF_MON_FILE ]];then            sed -i ‘1i 本次新增慢日誌 ‘$SUM_POINT‘ 條‘  $DIFF_MON_FILE            mail -s "[警告] 伺服器 $(hostname) 產生 MySQL 慢日誌 $SUM_POINT 條" $ADMIN_MAIL < $DIFF_MON_FILE            > $DIFF_MON_FILE            echo $NEW_POINT > $MON_POINT_FILE        fi        sleep ${SEC}s    done} function stop {        if [[ -n `ps -ef|awk ‘$0~"mon_mysql_slow_log.sh"{print $2}‘` ]];            then                for PID in `ps -ef|awk ‘$0~"mon_mysql_slow_log.sh"{print $2}‘`;                       do                           [[ $PID != $$ ]] && kill -9 $PID >& /dev/null                       done            else                echo ‘目前暫無MySQL慢日誌監控進程‘                exit 0        fi        echo ‘MySQL慢日誌監控進程已經停止運行‘} function restart {        stop        start &} if [[ $1 == stop ]]    then        :    else        [[ $2 < 3 ]] && USAGE        [[ ! -f $2 ]] && USAGEfi case $1 in    start)        start &        ;;    stop)        stop        ;;    restart)        MON_FILE=$2        restart        ;;    *)        USAGE        ;;esac

      OK!

       以上就是指令碼的全部內容。整個指令碼由四個主函數構成。針對每個函數的作用,我這裡做下介紹:

1234 USAGE   # 該函數負責提示使用者如何正確使用該指令碼start   # 該函數負責啟動指令碼stop    # 該函數負責停止監控指令碼restart # 該函數負責重啟監控指令碼

       下面附上指令碼的使用:

      指令碼的整個思路就是,通過while :;do statement;done啟一個死迴圈,然後在死迴圈裡面通過 sleep 來控制死迴圈的迴圈間隔。在指定的迴圈間隔內,通過取MySQL慢日誌的長度作為一個記錄點,然後在下一個迴圈到來時,通過比對上一個記錄點來得出,日誌是否有變化。如果有變化,就通過計算記錄點的差值來得出增長值。通過增長值來擷取到增長的這部分日誌,然後通過mail發送到指定的管理員郵箱。

      這裡展示下發送出來的郵件:

      OK!其它的一看就懂,這裡就不廢話了。

      本文到此結束,希望能對51博友有所協助!

MySQL慢日誌監控指令碼執行個體剖析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.