您的位置:首页 > 博客中心 > 数据库 >

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

时间:2022-03-15 18:25

原文:

故事背景

 

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

 

 

情况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}\n\n机器:${IP_ADDRESS}\n\n文件:${BACKUP_FILE_TODAY}\n\n大小:${FILE_SIZE_TODAY}(${FILE_SIZE_TODAY_H})\n\n时间:${DATE_TODAY}\n\n"

# 判断大小关系
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\r";exp_continue}
        "*password" {send "$SERVER_SSH_PASSWORD\r"}
    }
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备份服务器的脚本加入定时任务每天检查即可!最终发送效果如下:

技术图片

本类排行

今日推荐

热门手游