利用tar进行完全备份、增量备份、差异备份,并控制版本号,自动删除备份文件

因业务需求,需对一个目录进行定期备份,现在使用tar进行自动备份,计划每周一次完整备份,其他每天进行增量或者差异备份,所以写出下面的脚步通过指定参数来选择备份模式。备份文件只保留最近两个完整备份版本和附属的增量或差异备份版本。

[[email protected] script]# ./backup.sh         
Please select the backup or delete mode,[full|diff|incr|delete|help]

[[email protected] script]# ./backup.sh help
full-------完整备份
diff-------差异备份
incr-------增量备份
delete-----删除备份

脚步正文:

#!/bin/bash
# Backup script
# 2014/5/25  by Dinker

# Source directory,modify as need.
SOURCEDIR=/root/test
 
# Backup file directory,modify as need.
BAKDIR=/root
 
# The last name of the directory interception,modify as need.
#name=${SOURCEDIR##*/} 
name=`basename $SOURCEDIR`
LOG=$BAKDIR/$name.log
DB=$BAKDIR/$name-bakdb
DATE=`date +%Y%m%d-%H%M%S`

if [ $# != 1 ];then
echo -e "\033[034;1mPlease select the backup or delete mode,\033[0m\033[033;1m[full|diff|incr|delete|help]\033[0m" >&2
exit 1
fi

OPT=$1
case $OPT in

full)
# Full backup script
# Read db file and config   #控制主备版本号
if [ -f "$DB" ]; then
        eval `grep FULLVER $DB`
        OLD=$FULLVER
        NEW=$((OLD+1))
else
        NEW=1
fi
BAKFILE=$name-full-$NEW-$DATE.tar.gz
SNAP=$name-$NEW.snap
tar -cvzpf  $BAKDIR/$BAKFILE -g /$BAKDIR/$SNAP $SOURCEDIR
echo FULLVER=$NEW > $DB
echo "------------------------------------" >> $LOG
echo "$BAKFILE  " >> $LOG
echo -e "\033[32;1mArchived $BAKFILE with snapshot $SNAP\033[0m"
;;

diff)
# Different backup script
# Read db file and config   #读取主备版本号
if [ -f "$DB" ]; then
         eval `grep FULLVER $DB`
else
        echo -e "\033[031;1mWithout a full backup, backup cannot be different.\033[0m"
        exit 1
fi
 
if [ -f "$DB" ]; then      #控制差异备份的版本号
        OLD=`grep DIFFVER $DB | tail -n 1 | awk -F= ‘{ print $2 }‘`
        NEW=$(($OLD+1))
else
        NEW=1
fi
 
BAKFILE=$name-diff-$FULLVER-$NEW-$DATE.tar.gz
 
# Find the latest full backup file. 
FULLBAK=`find $BAKDIR -name "$name-full-$FULLVER-*" -exec ls {} \;`
 
find $SOURCEDIR  -newer $FULLBAK -print0 |tar --null -czpvf $BAKDIR/$BAKFILE -T -
 
echo DIFFVER=$NEW >> $DB
echo $BAKFILE >> $LOG
echo -e "\033[32;1mArchived $BAKFILE\033[0m"
;;

incr)
# Incremental backup script
# Read the full version.  
if [ -f "$DB" ]; then         
        eval `grep FULLVER $DB`
else
        echo -e "\033[031;1mWithout a full backup, backup cannot be incremental.\033[0m"
         exit
fi
# Incremental version control  
if [ -f "$DB" ]; then     
        OLD=`grep INCRVER $DB | tail -n 1 | awk -F= ‘{ print $2 }‘`
         NEW=$(($OLD+1))
else
         NEW=1
fi
BAKFILE=$name-incr-$FULLVER-$NEW-$DATE.tar.gz
VERSNAP=$name-$FULLVER.snap
 
# Begin incremental backup. 
tar -cvzpf  $BAKDIR/$BAKFILE -g /$BAKDIR/$VERSNAP $SOURCEDIR
echo INCRVER=$NEW >> $DB
echo $BAKFILE >> $LOG
echo -e "\033[032;1mArchived $BAKFILE with snapshot $VERSNAP\033[0m"
;;
delete)
# Delete the old backup files.
#自动删除14前的备份文件  
# find $BAKDIR -name "$name-$DEL.snap" -mtime -14 -exec rm -rf {} \;
# find $BAKDIR -name "$name-full-*" -mtime -14 -exec rm -rf {} \;
# find $BAKDIR -name "$name-incr-*" -mtime -14 -exec rm -rf {} \;
# find $BAKDIR -name "$name-diff-*" -mtime -14 -exec rm -rf {} \;

#通过读取全备的版本号来实现删除指定的备份文件 
if [ -f "$DB" ]; then
        eval `grep FULLVER $DB`
        DEL=`expr $FULLVER - 2`
fi
echo -e "\033[32;1mThe delete full version is\033[0m \033[31;1m$DEL\033[0m"

#查找需要删除的文件
if [ "$DEL" -ge 1 ]; then
    snapdel=`find $BAKDIR -name "$name-$DEL.snap"`   
    fulldel=`find $BAKDIR -name "$name-full-$DEL-*"`
    incrdel=`find $BAKDIR -name "$name-incr-$DEL-*" |sort`
    diffdel=`find $BAKDIR -name "$name-diff-$DEL-*" |sort`
fi

# Delete the backup file and modify it states in the log file.
for i in [ $snapdel $fulldel $incrdel $diffdel ]
do

    echo $i |sed ‘s/\ /\n/g‘ |awk -F/ ‘{print $3}‘ |xargs -I {} sed -i ‘s/{}/{}---------Deleted/‘ $LOG   #修改日志文件中已删除文件为Deleted
rm -rf $i       #删除备份
done

echo -e "\033[32;1mNow delete the following files.\033[0m \033[32;1m\n---------------------------------------\n$snapdel \n$fulldel \n$incrdel \n$diffdel \n---------------------------------------\033[0m"
;;
help)
echo -e "\033[32;1mfull-------完整备份\ndiff-------差异备份\nincr-------增量备份\ndelete-----删除备份\033[0m"
;;
*)
echo -e "\033[034;1mPlease select the backup or delete mode,\033[0m\033[033;1m[full|diff|incr|delete|help]\033[0m" >&2
;;
esac

测试使用:

[[email protected] script]# ./backup.sh full
tar: /root/test: Directory is new
tar: Removing leading `/‘ from member names
/root/test/
/root/test/1
/root/test/passwd
/root/test/yppasswd
Archived test-full-1-20140525-122919.tar.gz with snapshot test-1.snap

[[email protected] script]# ./backup.sh diff                   
Archived test-diff-1-1-20140525-122925.tar.gz
[[email protected] script]# ./backup.sh incr 
tar: Removing leading `/‘ from member names
/root/test/
Archived test-incr-1-1-20140525-122930.tar.gz with snapshot test-1.snap

查看生成的日志文件

[[email protected] script]# cat /root/test.log 
------------------------------------
test-full-1-20140525-122919.tar.gz  
test-diff-1-1-20140525-122925.tar.gz
test-incr-1-1-20140525-122930.tar.gz

为了测试需求,我这里使用seq 6|xargs -i command 重复运行一条命令,

[[email protected] script]# ./backup.sh full && seq 6 |xargs -i ./backup.sh incr && seq 6 |xargs -i ./backup.sh diff

日志:

[[email protected] script]# cat /root/test.log 
------------------------------------
test-full-1-20140525-122919.tar.gz  
test-diff-1-1-20140525-122925.tar.gz
test-incr-1-1-20140525-122930.tar.gz
test-diff-1-2-20140525-123639.tar.gz
test-diff-1-3-20140525-123639.tar.gz
test-diff-1-4-20140525-123639.tar.gz
test-diff-1-5-20140525-123639.tar.gz
test-diff-1-6-20140525-123639.tar.gz
test-incr-1-2-20140525-123650.tar.gz
test-incr-1-3-20140525-123650.tar.gz
test-incr-1-4-20140525-123650.tar.gz
test-incr-1-5-20140525-123650.tar.gz
test-incr-1-6-20140525-123650.tar.gz
------------------------------------
test-full-2-20140525-123755.tar.gz  
test-incr-2-1-20140525-123755.tar.gz
test-incr-2-2-20140525-123755.tar.gz
test-incr-2-3-20140525-123755.tar.gz
test-incr-2-4-20140525-123755.tar.gz
test-incr-2-5-20140525-123755.tar.gz
test-incr-2-6-20140525-123755.tar.gz
test-diff-2-1-20140525-123755.tar.gz
test-diff-2-2-20140525-123755.tar.gz
test-diff-2-3-20140525-123755.tar.gz
test-diff-2-4-20140525-123755.tar.gz
test-diff-2-5-20140525-123755.tar.gz
test-diff-2-6-20140525-123755.tar.gz
------------------------------------
test-full-3-20140525-123759.tar.gz  
test-incr-3-1-20140525-123759.tar.gz
test-incr-3-2-20140525-123759.tar.gz
test-incr-3-3-20140525-123759.tar.gz
test-incr-3-4-20140525-123759.tar.gz
test-incr-3-5-20140525-123759.tar.gz
test-incr-3-6-20140525-123759.tar.gz
test-diff-3-1-20140525-123759.tar.gz
test-diff-3-2-20140525-123759.tar.gz
test-diff-3-3-20140525-123759.tar.gz
test-diff-3-4-20140525-123759.tar.gz
test-diff-3-5-20140525-123759.tar.gz
test-diff-3-6-20140525-123759.tar.gz

使用delete删除历史备份文件,并在日志文件中修改已删除备份的状态;我这里是删除最新的两个版本的前一版本

[[email protected] script]# ./del-bakfile.sh delete
The delete full version is 1
Now delete the following files. 
---------------------------------------
/root/test-1.snap 
/root/test-full-1-20140525-122919.tar.gz 
/root/test-incr-1-1-20140525-122930.tar.gz
/root/test-incr-1-2-20140525-123650.tar.gz
/root/test-incr-1-3-20140525-123650.tar.gz
/root/test-incr-1-4-20140525-123650.tar.gz
/root/test-incr-1-5-20140525-123650.tar.gz
/root/test-incr-1-6-20140525-123650.tar.gz 
/root/test-diff-1-1-20140525-122925.tar.gz
/root/test-diff-1-2-20140525-123639.tar.gz
/root/test-diff-1-3-20140525-123639.tar.gz
/root/test-diff-1-4-20140525-123639.tar.gz
/root/test-diff-1-5-20140525-123639.tar.gz
/root/test-diff-1-6-20140525-123639.tar.gz 
---------------------------------------

[[email protected] script]# cat /root/test.log     
------------------------------------
test-full-1-20140525-122919.tar.gz---------Deleted  
test-diff-1-1-20140525-122925.tar.gz---------Deleted
test-incr-1-1-20140525-122930.tar.gz---------Deleted
test-diff-1-2-20140525-123639.tar.gz---------Deleted
test-diff-1-3-20140525-123639.tar.gz---------Deleted
test-diff-1-4-20140525-123639.tar.gz---------Deleted
test-diff-1-5-20140525-123639.tar.gz---------Deleted
test-diff-1-6-20140525-123639.tar.gz---------Deleted
test-incr-1-2-20140525-123650.tar.gz---------Deleted
test-incr-1-3-20140525-123650.tar.gz---------Deleted
test-incr-1-4-20140525-123650.tar.gz---------Deleted
test-incr-1-5-20140525-123650.tar.gz---------Deleted
test-incr-1-6-20140525-123650.tar.gz---------Deleted
------------------------------------
test-full-2-20140525-123755.tar.gz  
test-incr-2-1-20140525-123755.tar.gz
test-incr-2-2-20140525-123755.tar.gz
test-incr-2-3-20140525-123755.tar.gz
test-incr-2-4-20140525-123755.tar.gz
test-incr-2-5-20140525-123755.tar.gz
test-incr-2-6-20140525-123755.tar.gz
test-diff-2-1-20140525-123755.tar.gz
test-diff-2-2-20140525-123755.tar.gz
test-diff-2-3-20140525-123755.tar.gz
test-diff-2-4-20140525-123755.tar.gz
test-diff-2-5-20140525-123755.tar.gz
test-diff-2-6-20140525-123755.tar.gz
------------------------------------
test-full-3-20140525-123759.tar.gz  
test-incr-3-1-20140525-123759.tar.gz
test-incr-3-2-20140525-123759.tar.gz
test-incr-3-3-20140525-123759.tar.gz
test-incr-3-4-20140525-123759.tar.gz
test-incr-3-5-20140525-123759.tar.gz
test-incr-3-6-20140525-123759.tar.gz
test-diff-3-1-20140525-123759.tar.gz
test-diff-3-2-20140525-123759.tar.gz
test-diff-3-3-20140525-123759.tar.gz
test-diff-3-4-20140525-123759.tar.gz
test-diff-3-5-20140525-123759.tar.gz
test-diff-3-6-20140525-123759.tar.gz

利用tar进行完全备份、增量备份、差异备份,并控制版本号,自动删除备份文件,布布扣,bubuko.com

时间: 2024-12-07 21:39:02

利用tar进行完全备份、增量备份、差异备份,并控制版本号,自动删除备份文件的相关文章

完全备份数据和差异备份数据的shell脚本

#!/bin/bash  # # Description: 该脚本功能,以周为单位循环:周五实行完全备份,周六不备份,周日至周四实行差异备份: #              因工作需要,不实行压缩打包的方式,采用cp完全备份,rsync差异备份: #              若要使用该脚本,请直接修改下面的两个参数:BackupPath和DATAPath,其他地方请不要修改: #  DATE: 2017-04-24 22:43:00 # MODIFY DATE: 2017-04-28 10:0

【SQL Server备份恢复】维护计划实现备份:每周数据库完整备份、每天差异备份、每小时日志备份

原文:[SQL Server备份恢复]维护计划实现备份:每周数据库完整备份.每天差异备份.每小时日志备份 在数据库管理中,数据库备份是非常重要的. 通过维护计划向导,可以很方便的完成数据库备份. 下面的例子说明了如何实现数据库的备份,具体的备份策略是:每周日一次完整备份.每天差异备份(除周日外).每小时日志备份. 此外,还可以指定删除过期备份策略,比如,把10天前的备份删除,因为硬盘空间是有限的. 1. 2. 3. 4.这里你可以自定义名称,这里用了默认的MaintenancePlan,另外选择

backup4:数据库自动备份,自动删除备份文件

一:手写TSQL 脚本 1,自动备份 每周进行一次Database 的 Full Backup,设置 Schedule Interval 为Weekly use master go declare @FileName nvarchar(256) set @FileName = N'D:\SQLBackupFolder\TestDB_FullBackup_'+CONVERT(nvarchar(max),getdate(),112)+N'.bak' BACKUP DATABASE [TESTDB]

看完,你就理解什么是数据的全量、增量、差异备份了

在很远很远的地方,有一个帐房先生. 他每天要记很多很多的账单. 老先生一生谨慎,为了保证账本的安全, 便找来三个徒弟帮忙来对账本做备份, 这样即使账本丢失了, 也可以用备份的账本继续使用. 三个徒弟各有所长,分别采用了不同的做法: 大徒弟▼ 性格宅心仁厚,成熟稳重. 他采用的方式是每天都把师父的账单重新抄录一份.这样做的好处就是每天都是一份完整的账本,每一个备份的账本都可以直接使用,坏处则是每天要花费很多时间去进行记录,并且需要很多纸.墨水以及存账本的柜子. 二徒弟▼ 性格聪明伶俐,人小鬼大.

sqlServer数据库备份与还原——差异备份与还原

1.差异备份 是完整备份的补充 备份自上次完整备份以来的数据变动的部分 2.备份过程: 在做差异备份之前需要先进行完整备份.完整备份的过程见:https://i.cnblogs.com/EditPosts.aspx?postid=10322955 差异备份与完整备份过程类似,只是备份类型选为差异备份 3.还原过程: 在进行差异还原的时候先要进行完整备份还原,但是要注意要选择上以下两个对勾,否则会报错. 不要着急点击确定,在选项中选中覆盖现有数据库,同时在恢复状态处选择第二个. 点击确定后,可以看

数据库自动备份压缩脚本(备份最近七天,七天之前自动删除,只保留rar文件)

把下面脚本添加到服务器计划任务中去,设置为每天执行即可,文件备份路径即为脚本所在路径,必须安装压缩文件 @echo offrem 计算指定天数之前的日期,用于后面删除指定天数的数据set DaysAgo=7set/a year=1 rem 假设系统日期的格式为yyyy-mm-ddcall :DateToDays %date:~0,4% %date:~5,2% %date:~8,2% PassDaysset /a PassDays-=%DaysAgo%call :DaysToDate %PassD

tar高级教程:增量备份、定时备份、网络备份

一.概述 备份与恢复对于系统维护而言是至关重要的事情.不合理的备份与还原会让你的数据面临丢失的风险.许多用户都在丢失重要数据后才意识到这种风险.而要从这种情况恢复数据将是非常耗时并且困难的.所以我们应该从别人的错误中吸取教训,并确保你的系统处于保护中.先考虑一些问题: 何时进行备份? 如果你可以接受一个星期的数据丢失,那么每周备份一次就足够了.但是如果你只能容忍一天的数据损失,那么你就必须每天晚上进行备份. 备份到哪? 显然备份到系统所在磁盘不是明智之举,用户应该备份到外接硬盘或者磁带上面. 为

[转帖]tar高级教程:增量备份、定时备份、网络备份

tar高级教程:增量备份.定时备份.网络备份 作者: lesca 分类: Tutorials, Ubuntu 发布时间: 2012-03-01 11:42 ?浏览 27,065 次 61条评论 一.概述 备份与恢复对于系统维护而言是至关重要的事情.不合理的备份与还原会让你的数据面临丢失的风险.许多用户都在丢失重要数据后才意识到这种风险.而要从这种情况恢复数据将是非常耗时并且困难的.所以我们应该从别人的错误中吸取教训,并确保你的系统处于保护中.先考虑一些问题: 何时进行备份? 如果你可以接受一个星

SQLSERVER 差异备份、全备份

--exec BackUPDatabase_LeeHG语句参数说明: -- 示例:exec BackUPDatabase_LeeHG '参数一','参数二','参数三','参数四','参数五',' 参数六' -- 参数一:需要备份数据库的名称 -- 参数二:备份文件存放路径,可以是网络路径 -- 参数三:全备份时间 -- 参数四:全备份时间误差范围(小时) -- 参数五:参数三为网络路径时,访问网络路径的用户名,参数三为本地路径时可输入任意字符. -- 参数六:参数三为网络路径时,访问网络路径的