Rsync备份策略
备份一些代码 或者 配置文件 日志文件…
比如要求每天晚上12点备份日志和代码还有nginx配置文件 而且打包文件只保留7天
数据端
1.先写shell脚本写好
> mkdir /server/rsync/
> cd /server/rsync/
> vim back.sh
# !/bin/sh
# __author__:
ip=39.96.14.149;
# 1.打包文件
# 2.删除7天前的压缩文件
# 3. 推送到备份服务器
2.先写打包日志和配置文件的命令
> tar zchf /backup/back_$(date +%F).tar.gz /usr/local/nginx/conf /usr/local/nginx/html /usr/local/nginx/logs &>/dev/null
-z # 压缩
-c # 指定目录
-h # 不建立符号连接,直接复制该连接所指向的原始文件。
-f # 指定备份文件。
$(date +%F) # 指定日志输出格式为 年-月-日
## 把nginx 的日志和配置文件还有代码 打包到backup的目录里并且压缩后改名字叫back_后面以日期命名
3.删除7天以前的打包文件
find /backup/ -type f -ctime +7 -name *.tar.gz | xargs rm -rf
-type f # 定义类型是普通文件
-ctime +7 # 查找系统中7*24小时之前被创建文件数据的文件
-name # 文件名字
xargs # 把前面查询到的内容给我 我再给他赋予新的命令
4.把文件推到备份服务器
rsync -az /backup/ rsync_backup@152.136.106.241::backup --password-file=/etc/rsync.password
5.把上面那几个写到脚本里面
#!/bin/sh
# __author__:
ip=39.96.14.149
mkdir -p /backup/${ip} &&\
# 1.打包文件
/bin/tar zchf /backup/${ip}/back_$(date +%F).tar.gz /usr/local/nginx/conf /usr/local/nginx/html /usr/local/nginx/logs &>/dev/null &&\
# 2.删除7天前的压缩文件
/bin/find /backup/ -type f -mtime 7 -name *.tar.gz | xargs rm -rf &&\
# 3. 推送到备份服务器
rsync -az /backup/ rsync_backup@152.136.106.241::backup --password-file=/etc/rsync.password
# &&\的意思是 左边的执行成功后才执行后面的 \ 是换行的意思
# &>/dev/null 把标准输出信息写进垃圾桶
# &>/dev/null 2>&1 语句含义:
# &>/dev/null : 首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。
# 2>&1 :接着,标准错误输出重定向(等同于)标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。
6.写进定时任务 每天晚上12点执行这个脚本
crontab -e
# rsync
00 00 * * * /bin/sh /server/backup/back.sh >/dev/null 2>&1 # 每天00点00分执行这个任务
7.为了保持数据的完整性和安全性 给压缩文件加上指纹(MD5)
find /backup/ -type f -name *.tar.gz | xargs md5sum > /backup/${ip}/back_$(date +%F).md5
8.加入到脚本里面
#!/bin/sh
# __author__:
ip=39.96.14.149
mkdir -p /backup/${ip} &&\
# 1.打包文件
/bin/tar zchf /backup/${ip}/back_$(date +%F).tar.gz /usr/local/nginx/conf /usr/local/nginx/html /usr/local/nginx/logs &>/dev/null &&\
# 1.1 md5加密保证数据的完整性
/bin/find /backup/ -type f -name *.tar.gz | xargs md5sum > /backup/${ip}/back_$(date +%F).md5 &&\
# 2.删除7天前的压缩文件
/bin/find /backup/ -type f -mtime +7 -name *.tar.gz | xargs rm -rf &&\
# 3. 推送到备份服务器
rsync -az /backup/ rsync_backup@152.136.106.241::backup --password-file=/etc/rsync.password
备份服务端
服务端也就是backup端的备份文件如果不清理会出现问题 所以服务端只保留3个月的备份文件 并且验证推送过来的文件的完整性
1.删除3个月以前的备份文件
find /backup/ -type f -mtime +90 -name *.tar.gz | xargs rm -rf
find /backup/ -type f -mtime +90 -name *.md5 | xargs rm -rf
2.先校验如果当天没有备份就生成一个error日志文件
file=/backup/${ip}/back_$(date +%F).md5
if [ ! -e ${file} ];then
/bin/touch /backup/${ip}/$(date +%F)_error.log
echo "${ip}_$(date +%F) is not rsync" >> /backup/${ip}/$(date +%F)_error.log
exit
fi
# 上面的意思就是如果这个我文件没有生成 他那肯定就是没有备份成功 如果没有成功给我就生成一个error日志文件
3.校验如果MD5没有区别成功 同样也生成一个error文件
find /backup/ -type f -name "*$(date +%F).md5" | xargs md5sum -c 2>/dev/null | grep FAILED | wc -l
# 上面这个是 如果筛选到了 failed 他就会出现1行 如果没有就说明数据是完整的
# wc -l 统计行数
4.写入脚本
# !/bin/sh
# __author__:
ip=39.96.14.149
# 1.删除3个月以前的备份文件
/bin/find /backup/ -type f -mtime +90 -name *.tar.gz | xargs rm -rf
/bin/find /backup/ -type f -mtime +90 -name *.md5 | xargs rm -rf
# 2.对当天的文件进行校验
file=/backup/${ip}/back_$(date +%F).md5
if [ ! -e ${file} ];then
/bin/touch /backup/${ip}/$(date +%F)_error.log
echo "${ip}_$(date +%F) is not rsync" >> /backup/${ip}/$(date +%F)_error.log
exit
fi
error=$(find /backup/ -type f -name "*$(date +%F).md5" | xargs md5sum -c 2>/dev/null | grep FAILED | wc -l)
if [ $error -gt 0 ];then
/bin/touch /backup/${ip}/$(date +%F)_error.log
echo "${ip}_$(date +%F) md5 is FAILED" >> /backup/${ip}/$(date +%F)_error.log
fi
5.写入定时任务
crontab -e
0 7 * * * /server/backup/delete.sh > /dev/null 2>&1