Home / Community / Blog / Naprawianie repozytorium SVN z kopii

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...

Comments

Log in or create a user account to comment.

Just my blog...

Mon Tue Wed Thu Fri Sat Sun
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31