2011-04-04 484 views
36

我的家庭服務器出現硬盤故障。如何修復具有一個損壞版本的存儲庫?

一旦我意識到磁盤正在運行,我登錄並執行了一個包含多個項目的存儲庫的直接副本。

然而,由於該盤是失敗,修訂版本的一個被打破:

$ svnadmin verify master/ 
[...] 
* Verified revision 820. 
* Verified revision 821. 
* Verified revision 822. 
svnadmin: No such revision 823 

master/db/revs/master/db/revprops/目錄呢,着實不包含稱爲823任何文件,因此,本次修訂缺失(碎) 。在master/版本庫中有後續修訂(我真的想保留!)上修訂#947。

今天我找到了我最近的異地備份(!),它很高興地包含了這個版本。我想通過修復丟失的修訂版來「修復」master/中損壞的存儲庫,因爲它比備份更新。

我確信到轉儲文件加載到具有相同版本作爲master/複製的一個新創建的倉庫,所以它的所有的舊的「線性」格式3.

我嘗試了很明顯,只是文件823從備份的db/revs/db/revprops/目錄複製:

$ cp repos/db/revs/0/823 master/db/revs/ 
$ cp repos/db/revprops/0/823 master/db/revprops/ 

目錄repos/包含已經從備份轉儲裝載的存儲庫。現在我得到:

$ svnadmin verify master/ 
[...] 
* Verified revision 821. 
* Verified revision 822. 
svnadmin: /build/buildd/subversion-1.6.12dfsg/subversion/libsvn_delta/compose_delta.c:165: search_offset_index: Assertion `offset < ndx->offs[ndx->length]' failed. 
Aborted 

這不是很令人鼓舞。我嘗試了各種其他的svnadmin命令,但沒有一個讓驗證者高興。

我的下一個想法是退出複製並從破損存儲庫的「新鮮」副本開始,然後在 823之後轉儲出版本,並與備份合併。但是,這似乎並不可能,我不能缺少的一個後傾修訂:

$ svnadmin dump -r 824 master/ >r824.dmp 
svnadmin: No such revision 823 

注意,它不利於使轉儲「增量」,同時希望在它應該假裝世界開始修改824,並從那裏只是去:

$ svnadmin dump --incremental -r 824:947 master/ > dump.txt 
svnadmin: No such revision 823 

這確實輸出寫到dump.txt,但我不知道這是否可以依靠。請注意,它不會記錄它已成功轉儲任何修訂版。

更新:我還有另外一個想法:在master/從崩潰的磁盤拷貝較新版本的文件複製到備份,提供的「失蹤尾巴」:

$ for a in $(seq 910 947) ; do cp master/db/revs/$a repos/db/revs ; cp master/db/revprops/$a repos/db/revprops/ ; echo $a ; done 

然而,這似乎什麼都不做,只是破壞了目標庫:

$ svnadmin verify repos/ 
[...] 
* Verified revision 907. 
* Verified revision 908. 
* Verified revision 909. 
svnadmin: Corrupt representation '907 21815 45 30922 158d3e72732f45bf6f02919b22fc899a' 
svnadmin: Malformed representation header 

現在,我已經用完了想法。

+0

開始認爲這可能是其他StackExchange站點中的一種,但在這裏似乎有很多類似的問題。 – unwind 2011-04-07 09:26:41

+4

沒關係,關於版本控制工具的問題在這裏是公平的遊戲。 [FAQ](http://stackoverflow.com/faq)提到了「程序員常用的軟件工具」,版本控制很少用於其他領域(至少是非程序員)。 – 2011-04-08 20:15:58

+0

關於恢復損壞的存儲庫,我剛剛發現這個非常有趣的文章: https://spin.atomicobject.com/2015/10/06/svn-corruption-recovery/ – AFract 2016-08-25 08:26:42

回答

37

我解決了它。

解決方案當然是顯而易見的,一旦我意識到了。

我有這樣的:

  • master/:破倉庫的副本,特色修訂0..947,與修訂823的物理文件丟失。
  • repos/:從備份(轉儲文件)加載的存儲庫,涵蓋修訂版0..910。

該解決方案僅僅是從master/,從修訂版911及以後轉儲。這是可能的,沒有任何錯誤,我把它意味着沒有範圍911..947修訂的直接修訂823取決於狀態,或者說:

$ svnadmin dump --incremental -r 911:947 master/ > tail.txt 
* Dumped revision 911. 
* Dumped revision 912. 
* Dumped revision 913. 
[...] 
* Dumped revision 947. 

不管怎樣,那麼就適用轉儲到存儲庫從備份未來:

$ cat tail.txt | svnadmin load repos/ 
[lots of commits] 

現在我有充分的歷史恢復了,沒有任何問題:

$ svnadmin verify repos/ 
* Verified revision 0. 
* Verified revision 1. 
* Verified revision 2. 
[...] 
* Verified revision 945. 
* Verified revision 946. 
* Verified revision 947. 

耶!