系统: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,加入如下语句:

  1. #home full backup  每周日10:01开始对home做全备份
  2. 01 10 * * 0 root /opt/scripts/homeBackupScript/fullBackup.sh  
  3. #home incremental backup  每周一到周五的07:01-18:01每小时对home做一次增量备份。
  4. 01 07-18 * * 1-5 root /opt/scripts/homeBackupScript/incrementalBackup.sh 

配置文件 backup.conf

红色部分是需要配置的地方。其它变量看自己喜好。

  1. #  
  2. #author:root123.blog.51cto.com  
  3. #description: incremental backup configure file  
  4. #  
  5.  
  6. #which folder would you want to backup  
  7. scrPath=/yourFolderPath  
  8.  
  9. #whick folder would you want to bacup your data to 
  10. backupPath=/bacupFolderPath  
  11.  
  12. #backup roatate cycle  
  13. rotateCyle=4  
  14.  
  15. #incremental backup file name 
  16. listed_incremental_F_name=listed_incremental_F  
  17.  
  18. #full bacup file name 
  19. fullBackupName=full_backup.tar.gz  
  20.  
  21. #log file Name 
  22. logName=backup.log 

完全备份脚本 fullBackup.sh 根据前面的配置文件自动创建备份文件夹,rotateCyle指定的数字做周期循环。

  1. #!/bin/bash  
  2.  
  3. #  
  4. #author:root123.blog.51cto.com  
  5. #decription: create full backup  
  6. #  
  7.  
  8. #load backup configure file  
  9. source $(dirname $0)/backup.conf  
  10.  
  11. prefixName=$(basename $srcPath)  
  12. logFile=$backupPath/$prefixName.1/$logName  
  13. listed_incremental_F=$backupPath/$prefixName.1/$listed_incremental_F_name  
  14. fullBackup=$backupPath/$prefixName.1/${prefixName}_${fullBackupName}  
  15.  
  16. #check $backupPath  
  17. if [ -d $backupPath ]  
  18.   then :  
  19.   else 
  20.     mkdir -p $backupPath  
  21. fi  
  22.  
  23. function backupFolderRotate {  
  24.   for ((i=rotateCycle; i>1; i--))  
  25.   do  
  26.     j=$(($i-1))  
  27.     if [ -d $backupPath/$prefixName.$i ]  
  28.       then 
  29.         rm -rf $backupPath/$prefixName.$i  
  30.     fi  
  31.     if [ -d $backupPath/$prefixName.$j ]  
  32.       then 
  33.         mv $backupPath/$prefixName.$j $backupPath/$prefixName.$i  
  34.     fi  
  35.     mkdir -p $backupPath/$prefixName.$j  
  36.   done  
  37.  
  38.   if [ -d $backupPath/$prefixname.1 ]  
  39.     then :  
  40.     else 
  41.       mkdir -p $backupPath/$prefixname.1  
  42.   fi  
  43. }  
  44.  
  45. backupFolderRotate  
  46.  
  47. #create full backup file xxx.tar.gz  
  48. if [ -f $backupPath/$prefixName.1/$fullBackup ]  
  49.   then :  
  50.   else 
  51.     echo "$(date +%b\ %d\ %H:%M:%S) $basename $0: starting to full backup .." >> $logFile  
  52.     tar -g $listed_incremental_F -czPpf $fullbackup $srcPath  
  53.     echo "$(date +%b\ %d\ %H:%M:%S) $basename $0: full backup finished." >> $logFile  
  54. fi 

增量备份脚本 incrementalBackup.sh

  1. #!/bin/bash  
  2.  
  3. #  
  4. #author:root123.blog.51cto.com  
  5. #description: incremental backup   
  6.  
  7. #load backup configure file  
  8. source $(dirname $0)/backup.conf  
  9.  
  10. prefixName=$(basename $srcPath)  
  11. logFile=$backupPath/$prefixName.1/$logName  
  12. listed_incremental_F=$backupPath/$prefixName.1/$listed_incremental_F_name  
  13. fullBackup=$backupPath/$prefixName.1/${prefixName}_${fullBackupName}  
  14.  
  15. #check full backup file xxx.tar.gz  
  16. if [ -f $fullBackup ]  
  17.   then 
  18.   #create incremental file yyy.tar.gz  
  19.     echo -e "$(date +%b\ %d\ %H:%M:%S $basename $0: starting to incremental backup ..." >> $logFile  
  20.     tar -g $listed_incremental_F -czPpf $backupPath/$prefixName.1/$(date +%y%m%d\_%Hh%Mm_${prefixName}_incremental.tar.gz) $srcPath  
  21.     echo "$listed_incremental_F -czPpf $backupPath/$prefixName.1/$(date +%y%m%d\_%Hh%Mm_${prefixName}_incremental.tar.gz) $srcPath" 
  22.     echo -e "$(date +%b\ %d\ %H:%M:%S $basename $0: incremental backup finished." >> $logFile  
  23.   else 
  24.     echo -e "$(date +%b\ %d\ %H:%M:%S $basename $0: ERROR => $backupPath/$prefixName.1/${prefixName}FullBackup.tar.gz is not exist." >> $logFile  
  25.     exit  
  26. fi 

 注:以上脚本为手动输入,如发现输入有错,请指正,我好修改。谢谢!