linux实现对上传文件的定时备份、增量备份的方法
介绍
如果你们使用的是类似阿里云的OSS存储服务,那么可以使用服务提供的定时备份,这样可以不用考虑在服务器上做文件备份。
实际上想实现基础的备份还是非常简单的,我们平常使用tar、unzip等命令打包文件,在这个基础上编写一个shell脚本,利用linux的crontab功能添加一个定时执行程序,这样就可以简单实现文件备份。但是这种方式在文件量不断增大后还行吗?答案肯定是不行,当文件量不断增加,所占存储空间增大。这种简单的备份方式会让压缩时间过长,占用过多的存储空间。那么怎么解决这一问题呢?我们可以使用增量备份来避免每一次都对所有文件进行备份压缩而带来的时间和空间的问题。
下面介绍一下实现方式(linux系统环境)
在编写脚本之前需要先查看一下服务器上是否有crontab功能
注:在这里要赞一下这个crontab功能,确实十分实用
使用 rpm -qa|grep crontab命令查看是否已安装crontab
上图所示,表明已安装。
如果未安装,则使用yum命令进行安装
yum -y install vixie-cron yum -y install crontabs
vixie-cron 是 cron 的主程序;
crontabs 是用来安装、卸装、或列举用来驱动 cron 守护进程的表格的程序。
如果是内网环境,需要离线安装的可找要离线安装包
1.启动:systemctl start crond.service
2.查看状态:systemctl status crond.service
上图所示,表明crontab已经在运行
下面贴上常用命令
systemctl start crond.service //启动命令 systemctl status crond.service //查看状态 systemctl stop crond.service //关闭命令 systemctl restart crond.service //重启 systemctl enable crond.service //开机运行
有人用的不是systemctl命令,特此贴出service常用命令
service crond start //启动服务 service crond stop //关闭服务 service crond restart //重启服务 service crond reload //重新载入配置 service crond status //查看crontab服务状态
创建脚本文件
vim backup.sh
写入脚本命令(注:这个脚本是从网上找的,未找到原出处)
#!/bin/bash #好的做法 #根据项目不同来重命名该脚本 #例如 amountebak.sh or pandawillsbak.sh #该脚本最好放在 $bakpp定义的绝对路径部分 #你可以 在$bakpp下找到相应的备份文件 #例如 /usr/backup/amountebak.sh or /usr/backup/pandawillsbak.sh ########## Init Path ######## # 在下面的参数中必须定义的参数有 $bakpp、$project、$projectpp TAR=/bin/tar # 存放备份文件的地方,以项目名称区分 bakpp=/data/file_backup/"$project" # 需要备份的文件夹,文件夹的路径 project=file projectpp=/data/ # parament for varible ym=`date +%Y%m` ymd=`date +%Y%m%d` # 存储备份文件的子目录,以月份区分,他的上级目录是$bakpp定义的 monthbakpp=$bakpp/$ym gidpp=$monthbakpp gidshot=gid$project$ym # 完全备份的文件名 fullname=$ym # 增量备份的文件名 incrementalname=$ymd # Record the location of the log log=$bakpp/$project.log ############ chk_full ####################### # 检查完全备份是否存在,如果不存在就创建它 #this function check fullbackup file exist or not , if not then create fullbackup now chk_full() { if [ -e "$monthbakpp"/"$project"_"$ym"_full.tar.gz ];then echo ""$project"_"$ym"_full.tar.gz file exist!! ====`date +%Y-%m-%d-%T` " $log else tar_full fi } ######### chk_incremental ######## # 检查增量备份是否存在 chk_incremental() { while [ -e "$monthbakpp"/"$project"_"$incrementalname"_incremental.tar.gz ] do incrementalname=`echo "$incrementalname + 0.1" | bc ` done } ######## tar_incremental ####### # 执行增量备份 tar_incremental() { cd $projectpp echo "BEIGIN_TIME=====`date +%Y-%m-%d-%T` ==== CREATE "$project"_"$incrementalname"_incremental.tar.gz" $log sleep 3 $TAR -g $gidpp/$gidshot -zcf $monthbakpp/"$project"_"$incrementalname"_incremental.tar.gz $project echo "END_TIME========`date +%Y-%m-%d-%T` ==== CREATE "$project"_"$incrementalname"_incremental.tar.gz" $log } ######## tar_full ########### tar_full() { touch $gidpp/$gidshot cd $projectpp echo "BEIGIN_TIME=====`date +%Y-%m-%d-%T` ==== CREATE "$project"_"$fullname"_full.tar.gz" $log $TAR -g $gidpp/$gidshot -zcf $monthbakpp/"$project"_"$fullname"_full.tar.gz $project echo "END_TIME========`date +%Y-%m-%d-%T` ==== CREATE "$project"_"$fullname"_full.tar.gz" $log } ########### backup ############################## # 总体调用备份,此时会做相应的检查以确保备份前提准备充分 backup() { if [ -d $monthbakpp ]; then chk_full chk_incremental tar_incremental else mkdir -p $bakpp/$ym tar_full fi } ########### let's begin ############# # 先检查$bakpp是否存在,如果不存在先创建后备份 if [ -d $bakpp ];then backup else mkdir -p $bakpp backup fi #advice you can create a file for put backup file, eg /usr/cctcc #crontab #mini hours day month week command # */5 * * * * /home/mmroot/zbb/aaa.sh # 0 1 */1 * * /home/mmroot/zbb/aaa.sh # tar -ztf test.tar.gz 查看备份文件里面的文件
使用wq!命令保存文件
这个脚本文件有三处地方需要注意一下:
#存放备份文件的地方,以项目名称区分
bakpp=/data/file_backup/"$project"
#需要备份的文件夹,文件夹的路径
project=file
projectpp=/data/
上面的三个路径要根据自己具体情况进行更改
添加定时任务:输入命令
crontab -e
任务示例
05 03 * * * cd /data/file_backup/;sh file_backup.sh
然后使用 crontab -l 查看即可。
在备份完成后,可使用命令查看备份文件里面的文件
tar -ztf file.tar.gz //查看备份文件面文件
好了,到此定时备份、增量备份就结束了。
特此说明:更安全的方式是另找一个服务器做文件备份存储服务器。在本机完成定时备份、增量备份后,将文件推送到文件备份存储服务器。这样可以保证在磁盘损坏的情况下达到备份功能
下一篇:Docker Swarm实现服务的滚动更新的示例代码