指令碼監控MySQL伺服器

dbasdk發表於2014-07-07
http://blog.itpub.net/29254281/viewspace-1203311/

使用Redis監控的方式,監控MySQL伺服器
  1. #! /bin/bash
  2. #告警條件:
  3. #磁碟使用率超過70%
  4. #記憶體使用率超過50%
  5. #CPU使用率超過700%(伺服器是24核心的)
  6. #空閒執行緒小於50
  7. #出現錯誤或者警告日誌

  8. disk_target=70
  9. mem_target=50
  10. cpu_target=700
  11. idle_target=50

  12. port=3306
  13. password='root'

  14. #設定錯誤日誌的位置
  15. alert_file=/home/lihuilin/mysql/data/mysql.51vv.err
  16. alert_file_bak=$alert_file.bak

  17. error_msg=''
  18. serverip='127_0_0_1'
  19. alert_url='http://IP:port/servlet?to=dba&title=MySQLError('$serverip')&content='

  20. #設定監控日誌的位置
  21. logfile=/home/lihuilin/monitor_mysql.log


  22. pid=$(ps -ef | grep -w mysqld | grep -v grep | awk '{print $2}')
  23. if [ "$pid" == "" ] ; then
  24.     echo "[ERROR]MySQL is shutdown." >> $logfile
  25.     error_msg=$error_msg"+MySQL_is_shutdown"
  26. else
  27.     topcontent=$(top -b -p $pid -n 1 | grep $pid | awk '/mysqld/{print $0}')
  28.     cpuusage=$(echo $topcontent | awk '{print $9}')
  29.     memusage=$(echo $topcontent | awk '{print $10}')
  30.     diskusage=$(df -h | grep % | awk 'NR!=1' | tr -s ' ' | cut -d ' ' -f 2-6 | awk '{ sub(/%/,"",$4); if($4>'$disk_target') {print $0} }')
  31.     idleThread=$(mysql -uroot -p$password -P$port -e 'show full processlist\G' | grep 'State: $' | wc -l)
  32.     alert_content=$(diff $alert_file $alert_file_bak | grep -E 'ERROR|Warning' | sed 's/\./_/g' | sed 's/:/_/g'| sed 's/ /_/g' | sed 's/-/_/g')


  33.     echo $(date) >> $logfile
  34.     if [ "$alert_content" != "" ] ; then
  35.         echo "[ERROR]$alert_content" >> $logfile
  36.         error_msg=$error_msg"+errorlog#"
  37.         error_msg=$error_msg$alert_content
  38.     fi

  39.     if [ $(echo "scale=2; $memusage>$mem_target" | bc) -eq 1 ] ; then
  40.         echo "[ERROR]Memory usage:$memusage" >> $logfile
  41.         error_msg=$error_msg"+memtarget#$mem_target"
  42.         error_msg=$error_msg"+memusage#$memusage"    
  43.     else
  44.         echo "[INFO]Memory usage:$memusage" >> $logfile
  45.     fi

  46.     if [ $(echo "scale=2; $cpuusage>$cpu_target" | bc) -eq 1 ] ; then
  47.         echo "[ERROR]CPU usage:$cpuusage" >> $logfile
  48.         error_msg=$error_msg"+cpu_target#$cpu_target"
  49.         error_msg=$error_msg"+cpu_usage#$cpuusage"
  50.     else
  51.         echo "[INFO]CPU usage:$cpuusage" >> $logfile
  52.     fi

  53.     if [ "$diskusage" != "" ] ; then
  54.         echo "[ERROR]Disk usage:$diskusage" >> $logfile
  55.         error_msg=$error_msg"+diskspace#"$diskusage
  56.     fi

  57.     if [ $idleThread -le $idle_target ] ; then
  58.         echo "[ERROR]Idle thread:$idleThread" >> $logfile
  59.         error_msg=$error_msg"+idle_target#$idle_target"
  60.         error_msg=$error_msg"+idleThread#$idleThread"
  61.     else
  62.         echo "[INFO]Idle thread:$idleThread" >> $logfile
  63.     fi
  64. fi

  65. if [ "$error_msg" != '' ] ; then
  66.     error_msg=$(echo $error_msg | sed 's/\./_/g' | sed 's/:/_/g'| sed 's/ /_/g' | sed 's/-/_/g'| sed 's/\///g')
  67.     error_msg=$(echo $error_msg | sed 's/\[/_/g' | sed 's/\]/_/g')
  68.     curl $alert_url$error_msg
  69. fi

  70. cp -rf $alert_file $alert_file_bak

這裡比較費勁的是監控磁碟剩餘空間
下圖的這種結果是沒有辦法使用awk抽取資料的。

可以使用如下命令,格式化資料
  1. df -h | grep % | awk 'NR!=1' | tr -s ' ' | cut -d ' ' -f 2-6

格式化之後就可以使用awk了。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1209720/,如需轉載,請註明出處,否則將追究法律責任。

相關文章