数据库备份结果检查钉钉通知脚本

Posted lonelyxmas

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库备份结果检查钉钉通知脚本相关的知识,希望对你有一定的参考价值。

原文:数据库备份结果检查钉钉通知脚本

故事背景

 

由于公司数据库服务器非常多,所以如果真的需要去人工巡检备份情况还是很麻烦,于是就想通过脚本来自动检查并且每天通过钉钉机器人通知到用户。

 

 

情况1:当备份数据库能够联网

 

如果备份服务器能够联网,那么就能直接调用钉钉机器人的 API,这也是最简单的发送钉钉通知的方式,脚本如下,按需修改:

技术图片
#!/bin/bash

######################################################################
# 用途:mysql 备份检查钉钉通知
# 作者:Dylan<1214966109@qq.com>
# 时间:2020-01-15
######################################################################

######################################################################
# 钉钉消息
######################################################################
# 钉钉机器人地址(填写自己的机器人)
DINGDING_URL="https://oapi.dingtalk.com/robot/send?xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

# 发送消息函数
function SendMessageToDingding(){ 
    curl "${DINGDING_URL}" -H Content-Type: application/json -d "
    {
        "actionCard": {
            "title": "$1", 
            "text": "$2", 
            "hideAvatar": "0", 
            "btnOrientation": "0", 
            "btns": [
                {
                    "title": "$1", 
                    "actionURL": ""
                }
            ]
        }, 
        "msgtype": "actionCard"
    }"
}

######################################################################
# 系统变量
######################################################################
# 当日日期
DATE_TODAY=$(/usr/bin/date +\\%F)
# 昨天日期
DATE_YESTERDAY=$(/usr/bin/date -d last-day +%F)
# 当前IP地址
IP_ADDRESS=$(/usr/sbin/ip addr | grep inet | grep -vE inet6|127.0.0.1 | awk {print $2} | head -1)

######################################################################
# 用户变量(更改为自己的目录)
######################################################################
# 业务名称
SERVICE_NAME="测试服务"
# 备份目录
BACKUP_PATH="/data/backup/mysql-3306"
# 当日备份文件名称
BACKUP_FILE_TODAY="all-${DATE_TODAY}.sql"
# 昨天备份文件名称
BACKUP_FILE_YESTERDAY="all-${DATE_YESTERDAY}.sql"

######################################################################
# 获取两天的大小进行比较
######################################################################
# 今天的文件大小
if [[ -f ${BACKUP_PATH}/${BACKUP_FILE_TODAY} ]];then
    FILE_SIZE_TODAY=$(/usr/bin/ls -l ${BACKUP_PATH}/${BACKUP_FILE_TODAY} | /usr/bin/awk {print $5})
    FILE_SIZE_TODAY_H=$(/usr/bin/ls -lh ${BACKUP_PATH}/${BACKUP_FILE_TODAY} | /usr/bin/awk {print $5})
else
    FILE_SIZE_TODAY=0
    FILE_SIZE_TODAY_H=0
fi

# 昨天的文件大小
if [[ -f ${BACKUP_PATH}/${BACKUP_FILE_YESTERDAY} ]];then
    FILE_SIZE_YESTERDAY=$(/usr/bin/ls -l ${BACKUP_PATH}/${BACKUP_FILE_YESTERDAY} | /usr/bin/awk {print $5})
    FILE_SIZE_YESTERDAY_H=$(/usr/bin/ls -lh ${BACKUP_PATH}/${BACKUP_FILE_YESTERDAY} | /usr/bin/awk {print $5})
else
    FILE_SIZE_YESTERDAY=0
    FILE_SIZE_YESTERDAY_H=0
fi

# 消息内容
DINGDING_CONTENT="业务:${SERVICE_NAME}

机器:${IP_ADDRESS}

文件:${BACKUP_FILE_TODAY}

大小:${FILE_SIZE_TODAY}(${FILE_SIZE_TODAY_H})

时间:${DATE_TODAY}

"

# 判断大小关系
if [[ ${FILE_SIZE_TODAY} == 0 ]];then
    SendMessageToDingding "${SERVICE_NAME}数据备份-[失败]" ${DINGDING_CONTENT}
elif [[ ${FILE_SIZE_TODAY} -le ${FILE_SIZE_YESTERDAY} ]];then
    SendMessageToDingding "${SERVICE_NAME}数据备份-[失败]" ${DINGDING_CONTENT}
else
    SendMessageToDingding "${SERVICE_NAME}数据备份-[成功]" ${DINGDING_CONTENT}
fi
技术图片

需要注意红色部分:

0. 业务名称需要改为自己业务的名称。

1. 钉钉机器人的 Token 需要该为自己的机器人。

2. 数据库备份的 SQL 存放目录需要改为自己的目录。

3. 数据库备份的 SQL 名字需要改为自己名字格式。

 

 

情况2:服务器无法访问公网

 

为了数据库安全,某些时候是没有外网的,所以需要内网其它跳板机器帮忙完成消息发送,在备份机器上面定时执行脚本:

技术图片
#!/bin/bash

######################################################################
# 用途:MySQL 备份检查触发钉钉
# 作者:Dylan<1214966109@qq.com>
# 时间:2020-01-15
######################################################################

######################################################################
# 系统变量
######################################################################
# 当日日期
DATE_TODAY=$(/usr/bin/date +\\%F)
# 昨天日期
DATE_YESTERDAY=$(/usr/bin/date -d last-day +\\%F)
# 当前IP地址
IP_ADDRESS=$(/usr/sbin/ip addr | grep inet | grep -vE inet6|127.0.0.1 | awk {print $2} | head -1)

######################################################################
# 用户变量
######################################################################
# 业务名称
SERVICE_NAME="测试服务"
# 备份目录
BACKUP_PATH="/data/backup/mysql-3306"
# 当日备份文件名称
BACKUP_FILE_TODAY="all-${DATE_TODAY}.sql"
# 昨天备份文件名称
BACKUP_FILE_YESTERDAY="all-${DATE_YESTERDAY}.sql"

######################################################################
# 获取两天的大小进行比较
######################################################################
# 今天的文件大小
if [[ -f ${BACKUP_PATH}/${BACKUP_FILE_TODAY} ]];then
    FILE_SIZE_TODAY=$(/usr/bin/ls -l ${BACKUP_PATH}/${BACKUP_FILE_TODAY} | /usr/bin/awk {print $5})
    FILE_SIZE_TODAY_H=$(/usr/bin/ls -lh ${BACKUP_PATH}/${BACKUP_FILE_TODAY} | /usr/bin/awk {print $5})
else
    FILE_SIZE_TODAY=0
    FILE_SIZE_TODAY_H=0
fi

# 昨天的文件大小
if [[ -f ${BACKUP_PATH}/${BACKUP_FILE_YESTERDAY} ]];then
    FILE_SIZE_YESTERDAY=$(/usr/bin/ls -l ${BACKUP_PATH}/${BACKUP_FILE_YESTERDAY} | /usr/bin/awk {print $5})
    FILE_SIZE_YESTERDAY_H=$(/usr/bin/ls -lh ${BACKUP_PATH}/${BACKUP_FILE_YESTERDAY} | /usr/bin/awk {print $5})
else
    FILE_SIZE_YESTERDAY=0
    FILE_SIZE_YESTERDAY_H=0
fi

# 判断大小关系
if [[ ${FILE_SIZE_TODAY} == 0 ]];then
    DINGDING_TITLE="${SERVICE_NAME}数据备份-[失败]"
elif [[ ${FILE_SIZE_TODAY} -le ${FILE_SIZE_YESTERDAY} ]];then
    DINGDING_TITLE="${SERVICE_NAME}数据小于昨天-[失败]"
else
    DINGDING_TITLE="${SERVICE_NAME}数据备份-[成功]"
fi

# 消息内容
DINGDING_CONTENT="业务:$SERVICE_NAME#机器:$IP_ADDRESS#文件:$BACKUP_FILE_TODAY#大小:$FILE_SIZE_TODAY/$FILE_SIZE_TODAY_H#时间:$DATE_TODAY#"

# 服务器远程信息
SERVER_IP="192.168.0.100"
SERVER_SSH_USER="root"
SERVER_SSH_PORT="22"
SERVER_SSH_PASSWORD="123456"
SERVER_REMOTE_SH_FILE="/data/shell/MYSQL-BACKUP-DING.sh"

# 远程执行
/usr/bin/expect<<EOF
    spawn ssh -p $SERVER_SSH_PORT $SERVER_SSH_USER@$SERVER_IP "$SERVER_REMOTE_SH_FILE $DINGDING_TITLE $DINGDING_CONTENT"
    expect {
        -timeout 2
        "yes/no" {send "yes
";exp_continue}
        "*password" {send "$SERVER_SSH_PASSWORD
"}
    }
expect eof
EOF
技术图片

需要注意:

0. 用户变量需要按照自己的需求修改。

1. 备份机器需要 yum 按照 expect。

2. 远程服务器信息需要配置正确,特别是远程脚本的绝对路径。

 

远程服务器根据备份服务器脚本中的绝对路径添加以下脚本:

技术图片
#!/bin/bash

######################################################################
# 用途:MySQL 备份检查钉钉通知
# 作者:Dylan<1214966109@qq.com>
# 时间:2020-01-15
######################################################################

######################################################################
# 钉钉消息
######################################################################
# 钉钉机器人地址
DINGDING_URL="https://oapi.dingtalk.com/robot/send?xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

# 发送消息函数
function SendMessageToDingding(){ 
    curl "${DINGDING_URL}" -H Content-Type: application/json -d "
    {
        "actionCard": {
            "title": "$1", 
            "text": "$2", 
            "hideAvatar": "0", 
            "btnOrientation": "0", 
            "btns": [
                {
                    "title": "$1", 
                    "actionURL": ""
                }
            ]
        }, 
        "msgtype": "actionCard"
    }"
}

# 处理传递的变量
DINGDING_TITLE=$1
DINGDING_CONTENT=${2//#/\\n\\n}

# 发送消息
SendMessageToDingding $DINGDING_TITLE $DINGDING_CONTENT
技术图片

注意机器人地址即可!

最后只需要将情况1的脚本或者情况2备份服务器的脚本加入定时任务每天检查即可!最终发送效果如下:

技术图片

以上是关于数据库备份结果检查钉钉通知脚本的主要内容,如果未能解决你的问题,请参考以下文章

Jenkins配置项目集成钉钉通知

pytest + yaml 框架 -14.钉钉机器人通知测试结果

zabbix之钉钉报警通知

zabbix之钉钉报警通知

zabbix之钉钉报警通知

zabbix之钉钉报警通知