异地备份远程服务器文件脚本,如:MySQL 备份

事件背景

在运维工作过程中,我们通常都会有一句俗语叫:不要把鸡蛋放在一个篮子里。数据库备份也是一样,如果单放在一台机器或者放到一个环境,如果这个地方出问题,可能就会导致数据全部丢失。所以我们会经常涉及到数据异地备份的问题。

本文备份原理:

1. 远程服务器凌晨定时备份并推送到指定备份服务器。

2. 备份服务器配置 nginx 文件下载和用户认证,配置方法可以参照我之前 nginx 文章:

https://www.cnblogs.com/Dy1an/p/11249061.html

3. 本地备份服务器定时去拉取该服务器上面的备份。

当然,如果本地服务器也有固定公网最好为了安全起见在 nginx 上面限制访问的来源 IP。

脚本实例

由于每个人的目录这些存在差异,所以有需要的可以根据自己的环境修改:

#!/bin/bash

##########################################################################
# 用途:拉取备份
# 作者:Dylan<1214966109@qq.com>
# 时间:2020-02-21
##########################################################################


##########################################################################
# 用户变量
##########################################################################
DINGDING_WEBHOOK="这里是钉钉机器人地址"
DOWNLOAD_BASE_URL='http://这里是文件下载的基础地址'
DOWNLOAD_USER='用户名'
DOWNLOAD_PASSWORD='密码'
DOWNLOAD_COMMAND="/usr/bin/wget"


##########################################################################
# 系统变量
##########################################################################
# 注意自己备份的文件时间格式
DATE_TODAY=$(date +\%Y\%m\%d)

# 远程目录和本地保存目录,这里根据自己备份目录情况改写
BACKUP_DIRECTORY="mysql-3306/mysql_${DATE_TODAY}"
LOCAL_DIRECTORY="/data/download/mysql-3306/mysql_${DATE_TODAY}"

# 文件列表
FILE_ARRY=(
数据库名称1
数据库名称2
...
)


##########################################################################
# 备份文件
##########################################################################
mkdir -p ${LOCAL_DIRECTORY}

for ECHO_FILE in ${FILE_ARRY[@]};do
    cd ${LOCAL_DIRECTORY}
    # 注意下载路径拼接是否正确,我这里备份的sql是压缩的
    ${DOWNLOAD_COMMAND} --http-user=${DOWNLOAD_USER} --http-passwd=${DOWNLOAD_PASSWORD} ${DOWNLOAD_BASE_URL}/${BACKUP_DIRECTORY}/${ECHO_FILE}_${DATE_TODAY}.sql.gz >> /tmp/remote-backup.log
done


##########################################################################
# 处理备份结果
##########################################################################
cd ${LOCAL_DIRECTORY}
echo "日期:${DATE_TODAY}" > /tmp/download.txt

for EACH_LOCAL_FILE in ${FILE_ARRY[@]};do
    ls -l ${LOCAL_DIRECTORY}/${EACH_LOCAL_FILE}_${DATE_TODAY}.sql.gz
    if [[ $? != 0 ]];then
        echo "${EACH_LOCAL_FILE}[失败]" >> /tmp/download.txt
    else
        FILE_SIZE=$(ls -l ${LOCAL_DIRECTORY}/${EACH_LOCAL_FILE}_${DATE_TODAY}.sql.gz | awk {'print $5'})
        FILE_H_SIZE=$(ls -lh ${LOCAL_DIRECTORY}/${EACH_LOCAL_FILE}_${DATE_TODAY}.sql.gz | awk {'print $5'})
        echo "${EACH_LOCAL_FILE}[${FILE_SIZE}/${FILE_H_SIZE}]" >> /tmp/download.txt
    fi
done


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

# 执行
DINGDING_SUBJECT="数据库本地备份结果"
sed -i ":a;N;s/
/\r\r/g;ta" /tmp/download.txt
DINGDING_CONTENT=$(cat /tmp/download.txt)
echo $DINGDING_CONTENT
SendMessageToDingding ${DINGDING_SUBJECT} ${DINGDING_CONTENT}

注意红色部分修改为自己的!

最后加入定时任务,备份下载完成后钉钉机器人会通知到群里,如我的:

原文地址:https://www.cnblogs.com/Dy1an/p/12355785.html