2012-03-14 161 views
1

我一直在使用rsync snapshot script from Mike Rubel的修改版本,並且一直在調整它以執行我想要的操作。他只需要每小時快照;我希望通過crontab每隔一小時,一天,一週和一個月提供快照。rsync每小時/每日/每週備份快照腳本的幫助

這裏是我的腳本每小時:

if [ -d $BUP/temp ] ; then 
    rm -rf $BUP/temp ; 
fi; 

rsync -avzO --delete --exclude-from=$CONFIG/rsync-excludes /home/jwhendy/ $DAT/jwhendy/ ; 
rsync -avzO --delete --exclude=vault* --link-dest=../vault.hourly.0 $DAT/ $BUP/temp ; 

if [ -d $BUP/vault.hourly.2 ] ; then  
    rm -rf $BUP/vault.hourly.2 ; 
fi; 

if [ -d $BUP/vault.hourly.1 ] ; then 
    mv $BUP/vault.hourly.1 $BUP/vault.hourly.2 ; 
fi; 

if [ -d $BUP/vault.hourly.0 ] ; then 
    mv $BUP/vault.hourly.0 $BUP/vault.hourly.1 ; 
fi; 

mv $BUP/temp $BUP/vault.hourly.0 ; 

這裏的日常腳本(每週/每月的有幾乎相同的):

if [ -d $BUP/vault.daily.2 ] ; then  
    rm -rf $BUP/vault.daily.2 ; 
fi; 

if [ -d $BUP/vault.daily.1 ] ; then 
    mv $BUP/vault.daily.1 $BUP/vault.daily.2 ; 
fi; 

if [ -d $BUP/vault.daily.0 ] ; then 
    mv $BUP/vault.daily.0 $BUP/vault.daily.1 ; 
fi; 

if [ -d $BUP/vault.hourly.2 ] ; then 
    cp -al $BUP/vault.hourly.2 $BUP/vault.daily.0 ; 
fi; 

每小時腳本的偉大工程。我正在努力的是每小時 - >每日(和每日 - >每週等)的轉變。

目前,該腳本將起作用這樣的,比方說,如果每小時腳本運行6X在每天進行腳本將運行(「hourly.n」的簡稱後「hr.n」和「B_M」看臺對於單個快照):

| hour 1  | hour 2  | hour 3  | hour 4  | hour 5  | end of day | 
|------------+------------+------------+------------+------------+---------------| 
| hr.0 (b_0) | hr.0 (b_1) | hr.0 (b_2) | hr.0 (b_3) | hr.0 (b_4) | hr.0 (b_5) | 
|   | hr.1 (b_0) | hr.1 (b_1) | hr.1 (b_2) | hr.1 (b_3) | hr.1 (b_4) | 
|   |   | hr.2 (b_0) | hr.2 (b_1) | hr.2 (b_2) | hr.2 (b_3) | 
|   |   |   |   |   | daily.0 (b_3) | 

因爲如果它存在hourly.sh跳越hourly.2,我們可以看到,daily.0是首次與B_3創建,我已經失去了B_0,B_1和B_2。我寧願每小時進行一次hour.2的增量轉儲,每小時轉換爲daily.0,然後再刪除它。這樣,在任何給定的時間,我將每小時0,1和2,每日0將包含hourly.2的最新版本,然後它被刪除。

希望這是有道理的。

我試過把cp -al $BUP/hourly.2 $BUP/daily.0 ;行放在小時腳本中。有三個問題,我已經與這個碰上:

  • 似乎採取了很多比單獨rsync的腳本較長,即使它是技術上只是複製一些硬鏈接
  • 因爲這些都是硬鏈接時,在我的情況下,第一次備份將是全尺寸(〜20GB);後續運行應該會生成更新文件大小的快照(它會這樣做)。我預計最大的快照會逐漸進一步回到樹中(最終在每月一次)。這cp -al行似乎在每天保持穩定.0它永遠不會回到daily.1等等(這可能是一個誤解如何du工作。
  • 我想不出如何不打破備份鏈,迫使一個新的快照(全部20GB)不得不被重新創建,換句話說,hourly.2每天都在不斷傾銷。但是最終mv $BUP/daily.0 $BUP/daily.1將使得每日不再存在0,因此,它將不得不從頭開始重新下一次hourly.sh運行。

在任何情況下,希望很顯然我想要完成的任務。我想,用於轉換每個腳本援助(每小時,每天,每週)進入下一個「桶」(每日,每週,每月),而不必花費時間啃硬鏈條。

我也不想在上表中顯示的過程中丟失重要的快照。

非常感謝您的任何建議。

+0

對於你的第二個問題:你是什麼意思,最大的快照回退?據我所知你的第一個備份和所有以下備份應該是「等效的」。硬鏈接文件不關心首先存在哪個鏈接。用du檢查尺寸時,第一次和增量備份的尺寸是否不同? (假設你在備份之間沒有太大變化......) – 2012-03-14 14:30:57

+0

@JanRüegg:我用'du'得到了不同的結果。我通常會做'du -sh/media/bup/vault。*'。其中一個總是顯示〜20GB,並且(假設腳本沒有中斷),其餘的是從10s到100s的任何地方,這取決於改變了什麼。我有時在20GB的範圍內看到不止一個,所以我認爲硬鏈接被破壞了......也許我只是不明白「du」是如何測量尺寸的?它會「重複計數」,還是應該在總文件夾中使用du,然後迭代所有快照? – Hendy 2012-03-14 14:57:12

+0

http://rsnapshot.org/ – jordanm 2012-03-14 15:06:21

回答

1

OK,我做了一個關於硬連接測試,這裏對我來說發生的事情:

➜ rsync -az0 /home/jan/tmp/Source /home/jan/tmp/Dir1 
➜ rsync -az0 /home/jan/tmp/Source /home/jan/tmp/Dir2 --link-dest=/home/jan/tmp/Dir1 
➜ du -hs /home/jan/tmp/Source 
124M /home/jan/tmp/Source 
➜ du -hs /home/jan/tmp/Dir1 
124M /home/jan/tmp/Dir1 
➜ du -hs /home/jan/tmp/Dir2 
124M /home/jan/tmp/Dir2 

你可以看到,所有的硬鏈接的文件確實是等價的。這意味着,每一個備份本身都是一個「完整」備份,如果您僅在該備份上執行「du」操作,則會爲您提供完整的文件大小。

➜ du -hs /home/jan/tmp/Dir1 /home/jan/tmp/Dir2 
124M /home/jan/tmp/Dir1 
0 /home/jan/tmp/Dir2 

但是,如果你做一個「杜」上所有的人(如上面的第六命令),它將識別硬鏈接並顯示你已經遇到過的所有硬鏈接「零」的大小。然而,這僅僅取決於參數的排序,而不是在其硬鏈接是「第一」:

➜ du -hs /home/jan/tmp/Dir2 /home/jan/tmp/Dir1 
124M /home/jan/tmp/Dir2 
0 /home/jan/tmp/Dir1 

您的實際問題:

而不是做一個cp -al $BUP/hourly.2 $BUP/daily.0,然後刪除hourly.2反正,難道你只是做一個mv $BUP/hourly.2 $BUP/daily.0會多快更快?

+0

感謝有關'du'的解釋。這非常有幫助。是的,'mv'會更快,事後來看,我打算用我的'cp -al'命令來做什麼(我在'mv'上選擇'cp'時錯誤地考慮了一些事情)。我仍然沒有解決在每日運行時間內丟失每小時快照數量x的問題,但也許我只需要做更多的小時快照來彌補這一點。再次感謝您的幫助。也許我的問題主要是基於對硬鏈接和du'的誤解。 – Hendy 2012-03-17 14:25:37

+0

太棒了!很高興我能幫上忙。在這種情況下,您能否通過接受答案來標記問題已解決? – 2012-03-19 18:41:48

+0

對不起。我實際上是爲了當我讀它時,但是它在三分鐘內,所以我不得不等待...然後完全忘記:) – Hendy 2012-03-21 02:58:08