系统:redHat 5.5
背景:公司要求对projects和home数据做最大化的安全考验,除硬件的snapshot之外,既要做到异机备份,又要做到在一定周期内能找回某个时间点的数据,例如恢复最近一个月内每两个小时的数据。snapshot是storage硬件自带功能,异机备份用rsync写一行简单语句脚本就行,rsync -vazu --delete /sourceFolderPath root@destinationIP:/destinationPath。最后个要求在网上看了看,找了些脚本,但都发现配置复杂,且有些功能用不上。索性花了点时间写了个简单、直接的脚本来完成任务。
脚本功能:对指定文件夹定期增量备份,可自定义循环周期。
概念与原理:
完全备份:备份全部选中的文件夹,并不依赖文件的存档属性来确定备份那些文件。(在备份过程中,任何现有的标记都被清除,每个文件都被标记为已备份,换言之,清除存档属性)。
差异备份:差异备份是针对完全备份:备份上一次的完全备份后发生变化的所有文件。(差异备份过程中,只备份有标记的那些选中的文件和文件夹。它不清除标记,既:备份后不标记为已备份文件,换言之,不清除存档属性)说白了就是:差异将把前一次的数据都备份,一定要搞清是前一次的,另外他不管有没有打过标记他都备份,总之好恢复但太占空间。
增量备份是针对于上一次备份(无论是哪种备份):备份上一次备份后,所有发生变化的文件。(增量备份过程中,只备份有标记的选中的文件和文件夹,它清除标记,既:备份后标记文件,换言之,清除存档属性。)说白了就是:只备份当天有变化的数据,并且是带标记的数据,当备份完后还要清除标记,总之他占用空间小,恢复起来麻烦。
以上概念来自百度百科。说的通俗一点:
完全备份是将你指定的文件夹及其子文件全都压缩到一个包里。
差异备份是建立在完全备份上的,每次差异备份都跟完全备份做比较,把有变化的数据备份在一个压缩包里。例如A.tar.gz是星期天的完全备份,B.tar.gz,C.tar.gz,D.tar.gz,E.tar.gz, F.tar.gz分别是星期一到星期五的差异备份。你想恢复任意工作日的数据,只需要将A.tar.gz解压出来,然后解压对应工作日的压缩包覆盖到完全备份上即可。 这个方法优点是恢复数据快,但备份数据占用空间大。
增量备份是针对于上一次备份,每次增量备份都是跟上一次备份做比较,把有变化的数据备份在一个压缩包里。例如A.tar.gz是星期天的完全备份,B.tar.gz,C.tar.gz,D.tar.gz,E.tar.gz, F.tar.gz分别是星期一到星期五的增量备份。你想恢复任意工作日的数据,你想恢复星期五的数据,就不能像差异备份那样只解压完全备份和星期五的备份,而是要依次解压完全备份,星期一的备份,星期二的备份.....直到星期五的备份。这个方法的优点是节约备份空间,但恢复时间慢。
个人理解,如有什么错误,欢迎大家指正。
下面脚本是先完全备份,再在完全备份基础上增量备份,你可以根据自己需要改成差异备份。
用法举例:
编辑/etc/crontab,加入如下语句:
- #home full backup 每周日10:01开始对home做全备份
- 01 10 * * 0 root /opt/scripts/homeBackupScript/fullBackup.sh
- #home incremental backup 每周一到周五的07:01-18:01每小时对home做一次增量备份。
- 01 07-18 * * 1-5 root /opt/scripts/homeBackupScript/incrementalBackup.sh
配置文件 backup.conf
红色部分是需要配置的地方。其它变量看自己喜好。
- #
- #author:root123.blog.51cto.com
- #description: incremental backup configure file
- #
- #which folder would you want to backup
- scrPath=/yourFolderPath
- #whick folder would you want to bacup your data to
- backupPath=/bacupFolderPath
- #backup roatate cycle
- rotateCyle=4
- #incremental backup file name
- listed_incremental_F_name=listed_incremental_F
- #full bacup file name
- fullBackupName=full_backup.tar.gz
- #log file Name
- logName=backup.log
完全备份脚本 fullBackup.sh 根据前面的配置文件自动创建备份文件夹,rotateCyle指定的数字做周期循环。
- #!/bin/bash
- #
- #author:root123.blog.51cto.com
- #decription: create full backup
- #
- #load backup configure file
- source $(dirname $0)/backup.conf
- prefixName=$(basename $srcPath)
- logFile=$backupPath/$prefixName.1/$logName
- listed_incremental_F=$backupPath/$prefixName.1/$listed_incremental_F_name
- fullBackup=$backupPath/$prefixName.1/${prefixName}_${fullBackupName}
- #check $backupPath
- if [ -d $backupPath ]
- then :
- else
- mkdir -p $backupPath
- fi
- function backupFolderRotate {
- for ((i=rotateCycle; i>1; i--))
- do
- j=$(($i-1))
- if [ -d $backupPath/$prefixName.$i ]
- then
- rm -rf $backupPath/$prefixName.$i
- fi
- if [ -d $backupPath/$prefixName.$j ]
- then
- mv $backupPath/$prefixName.$j $backupPath/$prefixName.$i
- fi
- mkdir -p $backupPath/$prefixName.$j
- done
- if [ -d $backupPath/$prefixname.1 ]
- then :
- else
- mkdir -p $backupPath/$prefixname.1
- fi
- }
- backupFolderRotate
- #create full backup file xxx.tar.gz
- if [ -f $backupPath/$prefixName.1/$fullBackup ]
- then :
- else
- echo "$(date +%b\ %d\ %H:%M:%S) $basename $0: starting to full backup .." >> $logFile
- tar -g $listed_incremental_F -czPpf $fullbackup $srcPath
- echo "$(date +%b\ %d\ %H:%M:%S) $basename $0: full backup finished." >> $logFile
- fi
增量备份脚本 incrementalBackup.sh
- #!/bin/bash
- #
- #author:root123.blog.51cto.com
- #description: incremental backup
- #load backup configure file
- source $(dirname $0)/backup.conf
- prefixName=$(basename $srcPath)
- logFile=$backupPath/$prefixName.1/$logName
- listed_incremental_F=$backupPath/$prefixName.1/$listed_incremental_F_name
- fullBackup=$backupPath/$prefixName.1/${prefixName}_${fullBackupName}
- #check full backup file xxx.tar.gz
- if [ -f $fullBackup ]
- then
- #create incremental file yyy.tar.gz
- echo -e "$(date +%b\ %d\ %H:%M:%S $basename $0: starting to incremental backup ..." >> $logFile
- tar -g $listed_incremental_F -czPpf $backupPath/$prefixName.1/$(date +%y%m%d\_%Hh%Mm_${prefixName}_incremental.tar.gz) $srcPath
- echo "$listed_incremental_F -czPpf $backupPath/$prefixName.1/$(date +%y%m%d\_%Hh%Mm_${prefixName}_incremental.tar.gz) $srcPath"
- echo -e "$(date +%b\ %d\ %H:%M:%S $basename $0: incremental backup finished." >> $logFile
- else
- echo -e "$(date +%b\ %d\ %H:%M:%S $basename $0: ERROR => $backupPath/$prefixName.1/${prefixName}FullBackup.tar.gz is not exist." >> $logFile
- exit
- fi
注:以上脚本为手动输入,如发现输入有错,请指正,我好修改。谢谢!