svn cleanup: sqlite: obraz dysku bazy danych jest uszkodzony

94

Próbowałem zrobić, svn cleanupponieważ nie mogę zatwierdzić zmian w mojej kopii roboczej i otrzymałem następujący błąd:

sqllite: obraz dysku bazy danych jest uszkodzony

Czyszczenie nie może przetworzyć następujących ścieżek

Co mogę teraz zrobić?

Rubens Mariuzzo
źródło

Odpowiedzi:

98

Miałem ten sam problem. Poniższy wpis na blogu pomógł mi rozwiązać ten problem: http://www.polak.ro/svn-e200030-sqlite-database-disk-image-is-malformed.html

Sprawdzasz integralność bazy danych sqlite, która śledzi repozytorium (/.svn/wc.db):

sqlite3 .svn/wc.db "pragma integrity_check"

To powinno zgłosić pewne błędy.

Następnie możesz je wyczyścić, wykonując:

sqlite3 .svn/wc.db "reindex nodes"
sqlite3 .svn/wc.db "reindex pristine"

Jeśli po tym nadal występują błędy, nadal masz możliwość pobrania świeżej kopii repozytorium do folderu tymczasowego i skopiowania folderu .svn ze świeżej kopii do starej. Następnie stara kopia powinna znów działać i możesz usunąć folder tymczasowy.

HenningJ
źródło
6
to faktycznie rozwiązało mój problem. Dziękuję Ci bardzo.
Erdogan Kurtur
17
Co zrobić, jeśli nadal pojawia się błąd: obraz dysku bazy danych jest źle sformułowany?
j będzie
3
@jwill Mam również błąd po wdrożeniu rozwiązania podanego powyżej ... Ale próbowałem po prostu pobrać świeżą kopię repozytorium, a następnie nadpisać folder .svn nowej kopii do pobrania na starą ... rozwiązałem mój problem w ten sposób ...
Rushabh Shah
6
Dziwne, dostajęError: unable to identify the object to be reindexed
Pacerier
4
Wydaje się, że link polak.ro/… jest trwale wyłączony.
MadMike
21

Sprawdzanie integralności

sqlite3 .svn/wc.db "pragma integrity_check"

Sprzątać

sqlite3 .svn/wc.db "reindex nodes"
sqlite3 .svn/wc.db "reindex pristine"

Alternatywnie

Możesz być w stanie zrzucić zawartość bazy danych, którą można odczytać do pliku kopii zapasowej, a następnie przelać ją z powrotem do nowego pliku bazy danych:

sqlite3 .svn/wc.db

sqlite> .mode insert
sqlite> .output dump_all.sql
sqlite> .dump
sqlite> .exit

mv .svn/wc.db .svn/wc-corrupt.db
sqlite3 .svn/wc.db

sqlite> .read dump_all.sql
sqlite> .exit
matowe oparzenia
źródło
2
Pomogło to w przypadku błędu, który miałem z innym oprogramowaniem, więc dziękuję panu!
Azirius,
Dla mnie polecenie „reindex nodes” nie powiodło się, ale pomogło mi alternatywne obejście (odtworzenie bazy danych ze zrzutu)! Dzięki.
EvAlex,
1
Nie wyrzuciłem wszystkiego, ale to wystarczyło. Przewinął plik sql i zmienił końcowy ROLLBACK;na COMMIT;przed doung .read dump_all.sql.
Jan Katins,
2
Wydaje się, że to podejście zawodzi teraz z powodu błędu svn: E235000: In file 'D:\Development\SVN\Releases\TortoiseSVN-1.9.7\ext\subversion\subversion\libsvn_wc\wc_db_wcroot.c' line 311: assertion failed (format >= 1), jednak istnieje obejście tutaj: hanscarpenter.blogspot.com.au/2016/05/…
mpeac
Prawidłową poprawką dla błędu asercji jest: 1. Uruchomienie sqlite3 .svn/wc.db 'PRAGMA user_version;'względem oryginalnej bazy danych, aby uzyskać poprawną liczbę. 2. działać sqlite3 .svn/wc.db 'PRAGMA user_version = XXX;'przeciwko przywróconej wersji z poprawnym numerem.
Chronial
19

Czyszczenie SVN nie zadziałało. Folder SVN w moim systemie lokalnym został uszkodzony. Dlatego właśnie usunąłem folder, odtworzyłem nowy i zaktualizowałem z SVN. To rozwiązało problem!

EmKay
źródło
1
To zdecydowanie najłatwiejsze rozwiązanie. Zdobądź nową kopię roboczą i pracuj z nią: svn co URL.
Jahmic
16

Po zaniku zasilania natknąłem się na obraz dysku bazy danych, który jest źle sformułowany, a sugerowane polecenie ponownego zindeksowania węzłów nie rozwiązało wszystkich problemów z powodu naruszonych ograniczeń. Również procedura opisana w http://mail-archives.apache.org/mod_mbox/subversion-users/201111.mbox/%[email protected]%3E nie rozwiązała problemu.

Rozwiązanie w moim przypadku:

  • Ponownie wyewidencjonuj repozytorium svn do folderu tymczasowego
  • Skopiuj, czyli zamień plik „.svn / wc.db” z nowego pobrania na uszkodzony

Może to być przydatne, jeśli oryginalne pobranie svn zawiera wiele zmodyfikowanych lub niewersjonowanych plików i nie chcesz przełączać się do nowego pobrania svn.

Thomas853
źródło
13

Skopiowałem folder .svn z katalogu mojego współpracownika i to rozwiązało problem.

user3884070
źródło
Tutaj możemy również sprawdzić nową kopię roboczą tylko w tym samym systemie, a następnie zastąpić stary folder .svn nowym folderem .svn i w ten sposób możemy rozwiązać ten problem ...
Rushabh Shah
3
  1. sprawdź ten svn w innym miejscu
  2. pokaż ukryty plik .svn
  3. zamień plik wc

to działa dla mnie!

Kaikai
źródło
2

Może mogłoby być rozwiązaniem:

  1. kliknij prawym przyciskiem myszy projekt
  2. zespół -> rozłącz
  3. Wybierz: Usuń także ...

Teraz połącz ponownie:

  1. kliknij prawym przyciskiem myszy projekt
  2. zespół -> Udostępnij projekt
  3. wybierz swój repositorie: mój SVN(inny przypadek: git itp.)
  4. wybierz repositoriefolder

Uwaga:

W moim przypadku wykonałem kopię zapasową moich plików. (bezpieczne plecy: P)

Edytować:

Mowa o SVNwtyczce na Eclipse:)

mfruizs2
źródło
1

Widziałeś ten post na stronie Subversion? Możesz także potencjalnie spróbować sprawdzić poprawność i „naprawić” bazę danych bezpośrednio, jak opisano tutaj . (Pamiętaj, że nie jestem ekspertem, właśnie przeprowadziłem szybkie wyszukiwanie w Google. Może w ogóle nie mieć związku z Twoimi problemami).

Osobiście spróbuję ponownie sprawdzić repozytorium i ponownie zastosować zmiany. Nie jesteś pewien, czy jest to możliwe w Twoim przypadku?

Mightymuke
źródło
Dzięki, pokaż mi swoją sugestię.
Rubens Mariuzzo
ponowne sprawdzenie jest tym, co ostatecznie zrobiłem, zdecydowanie najłatwiejszym rozwiązaniem (w zależności od zmian do ponownego zastosowania ^^)
elgui
W moim przypadku to nie rozwiązało problemu, spowodowało również znacznie więcej błędów w Tortoise SVN, po prostu ostrzegam.
komorra
1

W trakcie moich badań znalazłem 2 realne rozwiązania.

  1. Jeśli używasz dowolnego typu połączeń, ssh, samba, montowanie, odłączanie / odmontowywanie i ponowne podłączanie / ponowne podłączanie. Spróbuj ponownie, to często rozwiązało problem. Następnie możesz wyczyścić svn lub po prostu kontynuować normalną pracę (w zależności od tego, kiedy pojawił się problem). Ponowne uruchomienie komputera również rozwiązało problem raz ... tak, to głupie, wiem!

  2. Czasami wszystko, co jest do zrobienia, to rm -rf plików (lub jeśli nie znasz tego terminu, po prostu usuń folder svn) i ponownie sprawdź repozytorium svn. Pamiętaj, że nie zawsze to rozwiązuje problem, a także możesz mieć zmiany, których nie chcesz utracić. Dlatego używam go jako drugiej opcji.

Mam nadzieję, że to wam pomoże!

Psykehoe
źródło
1

Rozwiązałem problem z uszkodzeniem rep-cache.db serwera Visual SVN.

Są dwa rozwiązania.

Zatrzymaj usługę Visual SVN Server.

Pobierz powłokę sqllite3.exe z witryny sqllite i skopiuj ją do folderu db repozytorium.

Wpisz następujące polecenia w wierszu polecenia w folderze db repozytorium.

- Pierwsze rozwiązanie -

sqlite3 rep-cache.db

.clone rep-cache-new.db

naciśnij ctrl + c, aby wyjść z sqllite.

ren rep-cache.db rep-cache-old.db

ren re-cache-new.db rep-cache.db

- Drugie rozwiązanie -

Usuń plik rep-cache.db

del rep-cache.db

zostanie utworzony automatycznie.

Muhammad Yousaf Sulahria
źródło
Dziękuję Muhammadzie - tylko wskazówka, której potrzebowałem! Należy określić, czy problem dotyczy bazy danych sqlite w kopii roboczej, czy tej na serwerze. Spróbuj wykonać zatwierdzenie w wierszu poleceń - jeśli przesyłanie pliku zakończyło się powodzeniem, a błąd wystąpił podczas „Dokonywania transakcji”, to prawdopodobnie problem występuje po stronie serwera. Rezolucja Mahometa działa tutaj jak urok. To stare archiwum listerve zawiera więcej szczegółów: svn.haxx.se/users/archive-2010-12/0257.shtml
powderflask
1

Naprawiłem to na przykład, gdy mi się to przytrafiło, usuwając ukryty folder .svn, a następnie wyewidencjonowując folder pod tym samym adresem URL.

To nie nadpisało żadnego z moich zmodyfikowanych plików i po prostu zaktualizowało wszystkie istniejące pliki, zamiast pobierać świeże kopie z serwera.

David Liljeblad
źródło
1

Nie trać czasu na checking integrityusuwanie danych zwork queue tabeli, ponieważ są to rozwiązania tymczasowe i po pewnym czasie Cię to odwróci.

Po prostu zrób coś innego checkouti zastąp istniejący folder .svn nowym. Zrób updatei wtedy wszystko powinno pójść gładko.

Jawad Khan
źródło
0

Jeśli zainstalujesz SVN Tortoise, przejdź do menedżera zadań i zatrzymaj go. Następnie spróbuj usunąć folder. to będzie działać

Ramesh Babu
źródło
0

Zaznaczona odpowiedź może być poprawna, zgodnie z porządkowaniem subversion. Ale błąd jest zdecydowanie ogólny, który doprowadził mnie tutaj, ta strona z pytaniami.

Nasz projekt ma zależność System.Data.SQLite i komunikat o błędzie był taki sam:

obraz dysku bazy danych jest uszkodzony

W moim przypadku wykonałem następujący skrypt kontrolny i następujące za pośrednictwem SQLiteStudio 3.1.1 .

pragma integrity_check

(Nie mam pojęcia, czy te statystyki pomogłyby, ale i tak się nimi podzielę ...)

Plik DataBase jest używany codziennie przez 1,5 roku w trybie dziennika połączeń w pamięci i miał około 750 MB. W tabeli było około 140 000 rekordów, a 6 tabel było tak dużych.

Po wykonaniu skryptu sprawdzania integralności 11 wierszy zostało zwróconych po 30 minutach wykonywania.

wrong # of entries in index sqlite_autoindex_MyTableName_1
wrong # of entries in index MyOtherTableAndOrIndexName_1
wrong # of entries in index sqlite_autoindex_MyOtherTableAndOrIndexName_2
etc...

Wszystkie wyniki dotyczyły indeksów. Po ponownym zbudowaniu każdego indeksu mój problem został rozwiązany.

reindex sqlite_autoindex_MyTableName_1;
reindex MyOtherTableAndOrIndexName_1;
reindex sqlite_autoindex_MyOtherTableAndOrIndexName_2;

Po ponownym zindeksowaniu sprawdzenie integralności zakończyło się „OK”.

Mam ten błąd w zeszłym roku i przywrócono mi DB z kopii zapasowej, a następnie ponownie wprowadziłem wszystkie zmiany, co było prawdziwym koszmarem ...

LysanderM
źródło
-1

nie musisz się martwić o facetów z blokadą katalogów.

Wystarczy, że jeśli sqllite3 nie jest zainstalowany, wpisz poniższe polecenie,

>sudo apt-get install sqlite3

Otwórz bazę danych SVN, wpisując to polecenie,

>sqlite3 .svn/wc.db 

Teraz musisz tylko usunąć wpisy locks z SVN DB.

sqlite>  select * from wc_lock;
1|-1           
sqlite>  delete from wc_lock;
sqlite>  select * from wc_lock;
sqlite>  .q

Proces zakończony. Możesz pracować na swoim repozytorium SVN, zatwierdzać, aktualizować, dodawać, usuwać operacje bez problemu.

:-)

mukesh bhoj
źródło
-2

Podczas tworzenia aplikacji odkryłem, że komunikaty pochodzą z częstych i masowych operacji INSERT i UPDATE. Pamiętaj, aby WSTAWIĆ i AKTUALIZOWAĆ wiele wierszy lub danych w jednej operacji.

var updateStatementString : String! = ""

for item in cardids {

let newstring = "UPDATE "+TABLE_NAME+" SET pendingImages = '\(pendingImage)\' WHERE cardId = '\(item)\';"
            updateStatementString.append(newstring)

        }


        print(updateStatementString)
        let results = dbManager.sharedInstance.update(updateStatementString: updateStatementString)

        return Int64(results)
Jorge Cardenas
źródło
-4

cd do folderu zawierającego .svn

rm -rf .svn
svn co http://mon.svn/mondepot/ . --force
mmbenyoub
źródło