事件背景
在运维工作过程中,我们通常都会有一句俗语叫:不要把鸡蛋放在一个篮子里。数据库备份也是一样,如果单放在一台机器或者放到一个环境,如果这个地方出问题,可能就会导致数据全部丢失。所以我们会经常涉及到数据异地备份的问题。
本文备份原理:
1. 远程服务器凌晨定时备份并推送到指定备份服务器。
2. 备份服务器配置 nginx 文件下载和用户认证,配置方法可以参照我之前 nginx 文章:
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/\n/\\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