增量備份、週期循環shell腳本

系統: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 

 注:以上腳本爲手動輸入,如發現輸入有錯,請指正,我好修改。謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章