设为首页 收藏本站
查看: 1283|回复: 0

[经验分享] 生产环境监控mysql服务状态

[复制链接]

尚未签到

发表于 2018-10-11 07:13:23 | 显示全部楼层 |阅读模式
  在生产环境中,如果某个重要的服务关闭了,可能会产生不可预料的结果,这时候,我们要作一个脚本,这个脚本可以监控服务状态,在服务关闭的时候,可以自动打开服务,确保用户的利益。
  下面我自己写了一个监控Mysql服务的脚本,目前还没有发现bug,如果有大神发现bug的话可以和我说一下哈,本人QQ:1090139534,我也是刚刚学习的,大家可以加我和我交流。
  #3306是mysqld服务的端口,看看是否是LISTEN状态。
  stat="`netstat -lnt|grep 3306 |grep  LISTEN`"
  #判断$stat是否为空
  if [ -z "$stat" ];
  then
  #如果为空就重启服务
  /etc/init.d/mysqld restart
  #判断上面的服务是否重启成功,如果失败就输出the mysql service restart fail
  [ $? -ne 0 ] && echo "the mysql service restart fail"
  else
  #如果$stat不为空就输出the mysql service is running
  echo "the mysql service is running"
  fi
  下面我们来实现一下。
  [root@zhouyu shell]# service mysqld status
  mysqld (pid  53476) 正在运行...
  [root@zhouyu shell]# service mysqld stop
  停止 mysqld:                                              [确定]
  [root@zhouyu shell]# sh db_check.sh
  停止 mysqld:                                              [确定]
  正在启动 mysqld:                                           [确定]
  [root@zhouyu shell]# sh db_check.sh
  the mysql service is running
  以上是我自己写的,下面这个是老师写的
  #!/bin/bash
  #查看3306端口有没有开启,并算出3306的行数
  portNum=`netstat -lnt|grep 3306|wc -l`
  #判断行数是否为0
  if [ $portNum -ne 0 ];
  then
  #如果行数不为0就说明在运行
  echo "mysql is running"
  else
  #如果行数为0就说明不在运行,就要重启服务
  /etc/init.d/mysqld restart
  fi
  下面是运行效果
  [root@zhouyu shell]# service mysqld stop
  停止 mysqld:                                              [确定]
  [root@zhouyu shell]# sh db_check1.sh
  停止 mysqld:                                              [确定]
  正在启动 mysqld:                                          [确定]
  [root@zhouyu shell]#
  最好就是转化为数字,老师就是这样弄的,上面之所以把脚本的名字改为db_check.sh是因为我们还有一个题目,这个题目是要查询mysql进程的,如果你的脚本里面有mysql的字眼,可能会影响结果。
  一般我们写脚本的时候,可以先看看在脚本里面执行的话是什么结果,比如说,我们可以先看看mysqld服务正常启动的时候,命令ps -aux | grep mysql |wc -l和命令netstat -lnt|grep 3306 |grep  LISTEN的结果是什么,这样方便我们写脚本。
  [root@zhouyu shell]# service mysqld status
  mysqld (pid  54334) 正在运行...
  [root@zhouyu shell]# ps -ef | grep mysql |wc -l
  3
  [root@zhouyu shell]# netstat -lnt|grep 3306 |grep  LISTEN
  tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN
  下面是我写的脚本,这个脚本和上面一样的功能,不同的是还要验证Mysql有没有运行进程,如果没有,还是要重启服务
  #!/bin/bash
  stat="`netstat -lnt|grep 3306 |grep  LISTEN`"
  progress="`ps -ef | grep mysql |wc -l`"
  #3306是mysqld服务的端口,看看是否是LISTEN状态。
  if [ -z "$stat" -a "$progress" -ne 3 ];
  #判断$stat是否为空
  then
  /etc/init.d/mysqld restart
  #如果为空就重启服务
  [ $? -ne 0 ] && echo "the mysql service restart fail"
  #判断上面的服务是否重启成功,如果失败就输出the mysql service restart fail
  else
  echo "the mysql service is running"
  #如果$stat不为空就输出the mysql service is running
  fi
  下面是效果
  [root@zhouyu shell]# service mysqld status
  mysqld (pid  62274) 正在运行...
  [root@zhouyu shell]# sh db_check.sh
  the mysql service is running
  [root@zhouyu shell]# service mysqld stop
  停止 mysqld:                                              [确定]
  [root@zhouyu shell]# sh db_check.sh
  停止 mysqld:                                              [确定]
  正在启动 mysqld:                                          [确定]
  [root@zhouyu shell]#
  下面这个是在生产环境中脚本,可以看看
  #!/bin/bash
  MYSQL=/etc/init.d/mysqld
  LogPath=/tmp/mysqld.log
  portNum=`netstat -lnt|grep 3306|wc -l`
  mysqlProcessNum=`ps -ef|grep mysqld|grep -v grep|wc -l`
  if [[ $portNum -eq 1 && $mysqlProcessNum -eq 2  ]];then
  echo "mysqld is running"
  else
  $MYSQL start >$LogPath
  portNum=`netstat -lnt|grep 3306|wc -l`
  mysqlProcessNum=`ps -ef|grep mysqld|grep -v grep|wc -l`
  if [[ $portNum -ne 1 && $mysqlProcessNum -ne 2 ]];then
  while true #因为有时候我们杀死一个进程可能杀不死,所以我们要不断的杀这个进程
  do
  killall mysqld >/dev/null 2>&1
  #如果这个进程给我们杀死了,再执行这个命令时就会提示没有可以杀的进程,这样,我们杀死进程的>
  命令就会执行不了了,这样$?就不等于0,这时候就说明我们已经完全杀了这个进程啦。就可以跳出这>
  个循环
  [ $? -ne 0 ] && break
  sleep 1
  done
  $MYSQL start >>$LogPath && status="successful"||status="failure"
  mail -s "mysql startup status is $status" 123456@qq.com &/dev/null
  if [ $? -eq 0  ];then
  echo "mysqld is running"
  else
  $MYSQL start >$LogPath
  mysql -uroot -p123456 -e "select version();" >&/dev/null
  if [ $? -ne 0  ];then
  while true #因为有时候我们杀死一个进程可能杀不死,所以我们要不断的杀这个进程
  do
  killall mysqld >/dev/null 2>&1
  #如果这个进程给我们杀死了,再执行这个命令时就会提示没有可以杀的进程,这样,我们杀死进程的>
  命令就会执行不了了,这样$?就不等于0,这时候就说明我们已经完全杀了这个进程啦。就可以跳出这>
  个循环
  [ $? -ne 0 ] && break
  sleep 1
  done
  $MYSQL start >>$LogPath && status="successful"||status="failure"
  mail -s "mysql startup status is $status" 123456@qq.com &/dev/null
  if [ $? -eq 0  ];then
  echo "mysqld is running"
  else
  $MYSQL start >$LogPath
  mysql -u$user -p$password -e "select version();" >&/dev/null
  if [ $? -ne 0  ];then
  while true #因为有时候我们杀死一个进程可能杀不死,所以我们要不断的杀这个进程
  do
  killall mysqld >/dev/null 2>&1
  #如果这个进程给我们杀死了,再执行这个命令时就会提示没有可以杀的进程,这样,我们杀死进程的>
  命令就会执行不了了,这样$?就不等于0,这时候就说明我们已经完全杀了这个进程啦。就可以跳出这>
  个循环
  [ $? -ne 0 ] && break
  sleep 1
  done
  $MYSQL start >>$LogPath && status="successful"||status="failure"
  mail -s "mysql startup status is $status" 123456@qq.com

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-620109-1-1.html 上篇帖子: mysql延迟判断模板 下篇帖子: mysql5.6升级5.7
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表