生产环境监控mysql服务状态

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

在生产环境中,如果某个重要的服务关闭了,可能会产生不可预料的结果,这时候,我们要作一个脚本,这个脚本可以监控服务状态,在服务关闭的时候,可以自动打开服务,确保用户的利益。

下面我自己写了一个监控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 <$LogPath

        fi

fi

还有一种就是比较高级的,它的判断是:用一个用户去登录,看看能不能登录上,登录上了还要自动的去查询版本,再看看上面的命令有没有成功,如果成功了就说明mysql在运行,下面是我自己写的

#!/bin/bash

MYSQL=/etc/init.d/mysqld

LogPath=/tmp/mysqld.log

mysql -uroot -p123456 -e "select version();" >&/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 <$LogPath

        fi

fi

可是我们发现,这个只是针对我们这台机的账号密码,如果是别的账号密码呢?这时候我们可以作一个脚本,这个脚本是专门用来写账号密码的,多说无益,我们来实验一下吧

首先先写一个放账号密码的脚本。把我们的账号密码放进去

#!/bin/bash

user=root

password=123456

下面我们对上面的那个脚本改造一下,把上面的用户root改为变量$user把密码123456改为变量$password如下

#!/bin/bash

MYSQL=/etc/init.d/mysqld

LogPath=/tmp/mysqld.log

mysql -u$user -p$password -e "select version();" >&/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 <$LogPath

        fi

fi

我们去看看效果

[root@zhouyu shell]# source database.sh 

[root@zhouyu shell]# source db_check3.sh 

mysqld is running

root@zhouyu shell]# service mysqld stop

停止 mysqld:                                              [确定]

[root@zhouyu shell]# source db_check3.sh

[root@zhouyu shell]# 

最后这种方法是老师推荐的,也是最简单的一种方法

这个方法是用php/java程序监控mysql

这个方法我不知道怎么写,老师也只是提一下,上面的脚本都有一个Bug,就算我们的数据库正常,可是用户访问出问题了,那也没有用呀,而用php/java的方法就不一样,这个方法是模拟用户去访问我们的网站,如果访问正常就正常,这样比较贴近用户。


本文转自 周子琪 51CTO博客,原文链接:http://blog.51cto.com/izhouyu/1891756


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
17天前
|
关系型数据库 MySQL Apache
mysql5.7 本地计算机上的mysql 服务启动后停止 的问题解决
mysql5.7 本地计算机上的mysql 服务启动后停止 的问题解决
11 0
|
23天前
|
存储 监控 关系型数据库
轻松入门Mysql:MySQL性能优化与监控,解锁进销存系统的潜力(23)
轻松入门Mysql:MySQL性能优化与监控,解锁进销存系统的潜力(23)
|
25天前
|
存储 Java 关系型数据库
社区医院管理服务系统【GUI/Swing+MySQL】(Java课设)
社区医院管理服务系统【GUI/Swing+MySQL】(Java课设)
25 1
|
1月前
|
SQL 监控 关系型数据库
MySQL性能调优:监控和优化
MySQL性能调优:监控和优化
57 1
|
2月前
|
监控 关系型数据库 MySQL
HeartBeat监控Mysql状态
HeartBeat监控Mysql状态
|
2月前
|
监控 安全 关系型数据库
在规划阿里云RDS跨区迁移资源和服务可用性
在规划阿里云RDS跨区迁移资源和服务可用性
261 4
|
1月前
|
弹性计算 关系型数据库 MySQL
阿里云ECS使用docker搭建mysql服务
阿里云ECS使用docker搭建mysql服务
152 1
|
2天前
|
存储 SQL 关系型数据库
不停止MySQL服务增加从库的两种方式
不停止MySQL服务增加从库的两种方式
|
1月前
|
关系型数据库 MySQL 数据库
使用Docker搭建MySQL数据库服务
本文介绍了如何使用Docker搭建MySQL数据库服务。首先,通过`docker pull mysql:5.7`命令拉取MySQL 5.7镜像,然后运行`docker run`命令创建并启动容器。接着,使用`docker exec`进入容器并创建MySQL用户及授权。最后,通过MySQL客户端如Navicat测试连接,验证安装成功。Docker简化了MySQL的部署和管理,确保环境一致性。
37 0
|
1月前
|
NoSQL 关系型数据库 MySQL
Docker安装详细步骤及相关环境安装配置(mysql、jdk、redis、自己的私有仓库Gitlab 、C和C++环境以及Nginx服务代理)
Docker安装详细步骤及相关环境安装配置(mysql、jdk、redis、自己的私有仓库Gitlab 、C和C++环境以及Nginx服务代理)
221 0