系統: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
注:以上腳本爲手動輸入,如發現輸入有錯,請指正,我好修改。謝謝!