且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

脚本监控MySQL服务器

更新时间:2021-09-03 10:23:24

使用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 --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 -| grep % | awk 'NR!=1' | tr -' ' | cut -' ' -f 2-| awk '{ sub(/%/,"",$4); if($4>'$disk_target') {print $0} }')
  31.     idleThread=$(mysql -uroot -p$password -P$port -'show full processlist\G' | grep 'State: $' | wc -l)
  32.     alert_content=$(diff $alert_file $alert_file_bak | grep -'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抽取数据的。
脚本监控MySQL服务器
可以使用如下命令,格式化数据
  1. df -h | grep % | awk 'NR!=1' | tr -s ' ' | cut -d ' ' -f 2-6
脚本监控MySQL服务器

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


本文转自ICT时空dbasdk的博客,原文链接:脚本监控MySQL服务器 ,如需转载请自行联系原博主。