您的位置:首页 > 数据库 > SQL

shell 脚本监控MySQL数据库启动状态

2015-10-31 21:39 836 查看
大前提:MySQL环境要有

需求:1. 端口号和进程同时存在时才能说明MySQL进程还在

2. 如果MySQL进程不在了 要能自动重启MySQL进程 并发出邮件通知

开始:

分步来:

(1)查MySQL 端口号还在不在的命令

执行 :netstat -lnt | grep 3306

输出: tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN

使用wc -l 统计行命令:netstat -lnt | grep 3306|wc -l 如果存在返回1 不存在 返回0 Ok 监听端口号 就是这个命令了

(2)查看MySQL进程还在不在

执行:ps -ef |grep mysqld

输出:

出现了三个进程但是我们只要一个(第二个):首先说下这三个进程出现的原因

第一个进程:因为路径中大有mysql 所以第一个线程会出现 (不建议路径中含有服务的名称 这个的话我们在查找时会带来一些麻烦)

第二个进程:MySQL服务 出现正常

第三个进程:是ps -ef..它自己的进程

但是虽然出现了三个我们也不可能现在重新装MySQL还有解决的:

分析三个进程的特点,发现以MySQL开头的 进程才是我们需要的进程于是乎使用下面命令,把不含MySQL的过滤掉:

执行:ps -ef|grep mysqld|awk -F " " '{ if ($1 ~ /mysql/) print $1}'#如果第一行含有MySQL则输出$1 第一行

输出:mysql #要的就是这样的结果

使用wc -l 改成第一种端口号的方式:$(ps -ef|grep mysqld|awk -F " " '{ if ($1 ~ /mysql/) print $1}'|wc -l)#有返回1 没有返回0

2. 如果MySQL进程不在了 要能自动重启MySQL 如果上面两种情况有一个不符合了我们都然乌MySQL进程不在了(端口号小时,MySQL进程不在了)

分析:为了以防万一 我们在发现上面情况不符合是 先使用killall mysqld杀一次(为确保能够杀死这里会使用循环来杀直至杀死)

邮件发送:echo "conten" mail -s "title" 4123232@163.com

重启MySQL:/etc/init.d/mysql start

单独命令已经写出下面进行组装:

vi monitoringDB.sh

#!/bin/sh

#################### monitoringDB ################

##create by zyb

##create date:20151031

isExistsPort=$(netstat -lnt | grep 3306|wc -l) #判断端口号是否存在

isExistsThred=$(ps -ef|grep mysqld|awk -F " " '{ if ($1 ~ /mysql/) print $1}'|wc -l )#判断MySQL进程是否存在

startDB=/etc/init.d/mysql#启动mysql的路径

logPath=/server/script/info.log#日志存放地址

if [ "$isExistsPort" -ne "1" -o "$isExistsThred" -ne "1" ]

then

$startDB start >> $logPath #starting mysql db

sleep 10

isExistsPort=$(netstat -lnt | grep 3306|wc -l)

isExistsThred=$(ps -ef|grep mysqld|awk -F " " '{ if ($1 ~ /mysql/) print $1}'|wc -l)

if [ "$isExistsPort" -ne 1 -o "$isExistsThred" -ne "1" ]

then

while true

do

killall mysqld

sleep 1

[ $? -ne 0 ]&& {#如果第一次杀掉了 第二次在执行 就会报错这里 $?就不是0 了 所以不是0时我们就跳出去

echo "db is stoped">>$logPath

break

}

done

$startDB start >> $logPath&&status="successful" || status="failer" #starting mysql db again

mail -s "db status is $status" sunyya@163.com < $logPath#发送邮件 "db status is $status“标题 $logPath 内容

fi
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: