Naprawianie repozytorium SVN z kopii
Miałem ciekawy przypadek błędu w repozytorium. Od razu powiem, że bez kopi zapasowej nie udało by mi się go rozwiązać.
Kopia robocza na jednym komputerze - wszystko działa (latami). Po jakimś czasie zachciało mi się (akurat - po prostu musiałem) w nim grzebnąć, ale już na nowym sprzęcie i ... klops. Okazało się, że repozytorium jest uszkodzone, co gorsza, jak się później okazało, już na wersji 2 (błąd dysku ???).
Komunikaty błędu miałem różne. Komenda svn pokazywała:
svn: REPORT of '/svnprv/reponame/!svn/vcc/default': Could not read \ chunk size: connection was closed by server (http://localhost)
w error_log apache'a było:
[error] [client 127.0.0.1] Provider encountered an error while \ streaming a REPORT response. [500, #0] [error] [client 127.0.0.1] A failure occurred while driving \ the update report editor [500, #160004]
a polecenie svnadmin verify reponame zwracało:
svnadmin: Checksum mismatch while reading representation: expected: 10b6f87d95a8283b4dc96607a662c4de actual: 1865015a5837bc21ea73397ee68e1c44
Po przejrzeniu backup'ów (makaronizm, ale "kopia zapasowa" jest taka długa...) znalazłem taki który miał poprawnie zapisaną wersję drugą - z przed 2 lat! W ten sposób posunąłem się o 400% (z wersji 1 do 4 ;-) do pełni szczęścia trochę brakuje...
Niby coś-tam działało, bo WebSVN ładnie pokazywał historie i doszedłem do tego, że mogę ściągać diff'y między różnymi wersjami, np.:
svn di http://localhost/svn/reponame@7 \ http://localhost/svn/reponame@15
W ten sposób dowiedziałem się, że tylko wersja 2 jest uszkodzona. Niestety próby odzyskania reszty danych z bieżącego repozytorium nie dawały pozytywnych rezultatów (testowałem na różnych wersjach):
svnadmin dump -r3 reponame svnadmin: Checksum mismatch while reading representation: expected: 959148e046aafa5f51db215c9ee0796d actual: 98824bfc23034f920d603d42a0810843
Oczywiście działało dla wersji 0 i 1. Kluczem okazał się przełącznik --incremental !
svnadmin dump -r3 --incremental reponame * Dumped revision 3.
Teraz już poszło gładko. Trzeba założyć nowe repozytorium i załadować do niego dane z kopii (była spakowana bzip2):
svnadmin create reponame-new bzcat reponame-2011-09-25.dump.bz2 | svnadmin load reponame-new ... ------- Committed revision 4 >>>
ustalić numer ostatniej wersji, powiedzmy 45 (żeby nie było równo) i wtedy (jak widać wersję 4 już miałem):
for x in `seq 5 45` ; do svnadmin dump --incremental -r $x reponame \ | svnadmin load reponame-new; done
... no trochę to trwało, ale za to pełen sukces.
Teraz wystarczy skasować stare i zmienić nazwę "nowego":
rm -rf reponam mv reponame-new reponame
Ładowane dane były do pustego repozytorium, więc UUID się nie zmienił.
Teraz trzeba poprawić skrypt, żeby po pierwsze wychwytywał błędy przy robieniu zrzutu (dump) i może dodatkowo wykonywał jeszcze zrzut ostatnich np. 10 wersji...
Kommentare
Bitte melden Sie sich Logan oder registrieren Sie sich um kommentieren zu können.