2011-11-13 284 views
2

我一直在使用Doug Hellmann的腳本來備份我的存儲庫2年,最終我的服務器硬盤丟失了。於是我在另一臺機器上創建了一個全新的回購機制,並試圖執行還原命令,即:從備份中恢復SVN存儲庫

gunzip -c `ls -tr dump*` | svnadmin load /home/svn/myproject 

只有它不起作用。它給出了迴應

<<< Started new transaction, based on original revision 917 
svnadmin: File not found: transaction '0-1', path 'MineSweeper2/src/com/bytezone/minesweeper2/Game.java' 
    * editing path : MineSweeper2/src/com/bytezone/minesweeper2/Game.java [email protected]:~/SVN backups$ 

任何人都可以解釋這裏有什麼問題嗎?我有過所有增量備份,當然這是最簡單的情況。

順便提一下,是否可以在嘗試加載之前將十幾個備份文件壓縮到單個文件中?

回答

1

看來備份沒有按正確的順序處理。 svnadmin load重新生成存儲庫中的提交以獲取新副本。它似乎正在提交文件修改,但該文件尚未創建,因爲提交不正確的順序。

+0

它們應該按照正確的順序(由於-t選項),但我確實先將它們複製到新服務器,以便可能重新排序時間戳。我實際上無法分辨,因爲他們現在似乎都有相同的時間戳。 – dmolony

+0

我見過很多複製操作,在複製多個文件時沒有考慮順序。你不能使用字母順序嗎?如果你逐個運行第一次轉儲會發生什麼? – madth3

+0

謝謝。我按順序「觸摸」了每個文件,現在它可以工作。 – dmolony

0

我不得不對他的劇本採取快速措施。它看起來像只對自上次轉儲後發生的更改執行轉儲文件,然後對其進行壓縮。

如果是那樣的話,應該能夠解壓所有壓縮備份,然後一起將它們連接起來以正確的順序以創建單個有效的轉儲文件。

以正確的順序是關鍵。它看起來像在轉儲文件的名稱中保留了修訂範圍,但修訂號不是零填充,這意味着對文件名進行排序可能是一個問題。

可能可以根據備份文件的cdatemdate對轉儲文件進行排序,但這有點危險。

轉儲文件的名稱是${dumpfilename}-${repo_name}-${first}-${last}.${compress_ext},因此可以使用-作爲字段分隔符並以數字方式在第3個字段上進行排序。

sort -t - -k3,3n 

這會使它們按正確的順序排列。然後,你也許能夠做這樣的事情:

ls | sort -t - -k3,3n | while read backup 
do 
    bzcat $backup | svnadmin load $repos 
done 

當然,這完全是未經檢驗的,因爲我沒試過道格·海爾曼的劇本,但應該是八九不離十。您可以通過執行此操作將所有內容合併到一個轉儲中:

ls | sort -t - -k3,3n | while read backup 
do 
    bzcat $backup >> $dumpfile 
done 

希望有效。或者,至少讓你朝着正確的方向發展。

+0

謝謝。我通過手動更改時間戳來實現它,但如果名稱是零填充(如您所建議的)並且恢復命令按名稱排序,則會更容易。我會嘗試你建議的聯合步驟。 – dmolony

+0

這是Kornshell比Bash更好的時代之一。在Kornshell中,可以使用'typeset'將變量聲明爲固定寬度的零填充變量。你首先要排版-Z,那樣會解決問題。在Bash中,你可以使用'printf'來將'first'格式化爲零填充,這真的有幫助。這是一個小小的改變,但會使恢復變得更容易。至少你不需要做那種時髦的'sort'來按正確的順序進行操作。 'ls'會自動爲你做。我會建議給作者。 –