Miałem pewne problemy z pamięcią RAM (kilkakrotnie bluescreen, Windows XP) i teraz uszkodzone są moje bazy danych Firefox. Firefox działa, ale moja historia nie ma, a to zgłoszenie kilku nieścisłości i błędy podczas wykonywania pragma integrity_check
na places.sqlite
:
obraz dysku bazy danych jest zniekształcony
Teraz pytanie, jak naprawić bazy danych SQLite?
firefox
data-recovery
database
sqlite
places.sqlite
Konstabl
źródło
źródło
Odpowiedzi:
Uwaga
Ponieważ Firefox musi być zamknięty, aby wykonać tę procedurę, koniecznie otwórz tę stronę w innej przeglądarce internetowej lub wydrukuj ją przed kontynuowaniem.
Po wielu godzinach pracy nad odzyskaniem bazy danych Miejsc, nawet po przeczytaniu kodu źródłowego Firefoksa, udało mi się. Oto jak to zrobiłem:
C:\Users\<username>\AppData\Roaming\Mozilla\Firefox\Profiles\<code>.default
folderze.places.sqlite
pliku. Jeśli plik został zastąpiony z powodu uszkodzenia, użyjplaces.sqlite.corrupt
go do odzyskania. Utwórz kopię zapasową pliku o nazwieplaces.sqlite.bak
lubplaces.sqlite.corrupt.bak
.sqlite3 places.sqlite
lubsqlite3 places.sqlite.corrupt
), a następnie wprowadź:Ponieważ baza danych jest uszkodzona, wynikowy zrzut bazy danych nie jest kompletny i nie wszystkie odzyskane dane zostały pobrane. Aby ustalić, gdzie wystąpił błąd, wyszukaj słowo
ERROR
(wszystkie wielkie litery) w komentarzu SQL w pliku zrzutudump.sql
(użyłem do tego Notepad ++ ) i przeczytajINSERT
powyższe polecenie SQL , aby ustalić tabelę. W moim przypadku uszkodzony jest stółmoz_places
. (Opis tabel znajdujących się w bazie danych Miejsc można znaleźć tutaj , który zawiera nieaktualny diagram ER.) Wyjaśnię, jak odzyskać dodatkowe dane tylko z tej tabeli; poniższa procedura prawdopodobnie nie ma zastosowania w przypadku innych tabel, więc pomiń te podetapy, jeśli w grę wchodzi tabela inna niżmoz_places
).moz_places
tabeli ma identyfikator. Wiersze są zrzucane z tabeli zgodnie z kolejnością tego identyfikatora. 1 Identyfikator to pierwsza wartość po nawiasie otwierającym wINSERT
instrukcji. Obszar, w którym baza danych jest uszkodzona, prawdopodobnie będzie małym blokiem wierszy w tej tabeli; chodzi tutaj o pominięcie tego uszkodzonego obszaru i odzyskanie jak największej ilości danych. Obszar początkowy takiego bloku jest reprezentowany na zrzucie jako wiersz przedERROR
pojawieniem się komentarza. Używając identyfikatora dla tego wiersza, możemy ustalić, gdzie baza danych jest uszkodzona. Robimy to, stosującSELECT
jako warunek instrukcje z identyfikatorem; ten proces wymaga prób i błędów. Na przykład, jeśli ostatnim identyfikatorem przed błędem był 49999, a błąd wystąpi później, uszkodzony blok zaczyna się od ID 50000. Użyj instrukcji takich jak:id >=
i powtarzaj powyższeSELECT
polecenie, aż znajdziesz najmniejszą wartość, która nie spowoduje, że SQLite wyświetli błąd. Jest to identyfikator, który odnosi się do wiersza, od którego możemy odzyskać dodatkowe dane. Załóżmy, że ten identyfikator to 50200. Aby zrzucić te dane, wprowadź:INSERT
instrukcje wdump2.sql
pliku zaczynają się odINSERT INTO table VALUES
, więc użyj funkcji Znajdź i zamień w edytorze tekstu, aby zamienić wszystkie wystąpienia tego ciągu naINSERT INTO moz_places VALUES
.dump2.sql
pliku i wklej go dodump.sql
pliku, w którymERROR
pojawia się komentarz.ROLLBACK; -- due to errors
na końcu pliku naCOMMIT;
.dump.sql
pliku. Zastąp<version>
poprawną wartością, która jest wymagana dla Firefoksa do ustalenia wersji schematu bazy danych na podstawie wersji Firefoksa, w następujący sposób (można go znaleźć w pliku źródłowym Firefoxtoolkit/components/places/Database.cpp
):places.sqlite
, a następnie uruchom powłokę SQLite,places.sqlite
używając pustej bazy danychsqlite3 places.sqlite
. Wpisz,.read dump.sql
aby załadować zrzut SQL do bazy danych.Bardziej odpowiednie informacje można znaleźć na następujących stronach:
Procedura uproszczona jest opisana w tym artykule MDN, ale jej nie przetestowałem. Niemniej jednak dołączyłem zaktualizowane
PRAGMA
polecenia z tego artykułu.1 SQL zwykle nie gwarantuje, że dane wyjściowe bazy danych będą podawane w dowolnej kolejności, chyba że użyjesz
ORDER BY
klauzuli. JednakORDER BY
prawdopodobnie nie wygeneruje żadnych danych wyjściowych w uszkodzonej bazie danych (ponieważ SQLite będzie musiał odczytać całą tabelę, zanim będzie mógł wygenerować jakiekolwiek dane wyjściowe). O ile mi wiadomo, Firefox zawsze zapisujemoz_places
pozycje tabeli z sekwencyjnymi identyfikatorami, więc możemy założyć, że wszystkie dane wyjściowe są uporządkowane według ID.źródło
Cóż, w zależności od tego, jak jest uszkodzony, naprawa może nie być możliwa. Najlepszym rozwiązaniem jest prawdopodobnie próba zrzucenia bazy danych za pomocą
sqlite
, a następnie sprawdzenie, co można uratować.Jeśli to się nie powiedzie, prawdopodobnie będziesz musiał przywrócić dane z kopii zapasowej.
Aby zrzucić i ponownie utworzyć bazę danych, użyj polecenia
.dump
:źródło
d:\sqlite3.exe d:\idimager.cat.db .dump | d:\sqlite3.exe d:\newdb.cat.db
. Wszystkie ulubione zniknęły, ale odbudowuję je, kiedy odwiedzam strony. Dzięki jeszcze raz!places.sqlite.corrupt
pliku. Opublikowałem kolejną odpowiedź z rozwiązaniem, które działało dla mnie.Jak zawsze podczas przeprowadzania takiej naprawy, zalecamy wykonanie przynajmniej jednej kopii zapasowej pliku places.sqlite w katalogu profilu. Posiadanie kopii zapasowej pozwala wypróbować różne rzeczy w celu naprawy takich problemów, jednocześnie wiedząc, że jeśli próba naprawy pogorszy sytuację, zawsze możesz wykonać kolejną kopię kopii zapasowej, na której można spróbować ponownie.
W zależności od tego, co jest uszkodzone i jak bardzo jest uszkodzone, może być możliwe rozwiązanie problemów z rozszerzeniem Konserwacja miejsc . Kilka razy skończyłem z uszkodzonym plikiem places.sqlite. Miejsca Konserwacja była w stanie rozwiązać problem za każdym razem, uruchamiając różne kontrole / poprawki, które udostępnia jako operacje w oknie dialogowym opcji. Różne kontrole i / lub raportowanie powinny zająć od kilku minut do minut.
Jeśli to nie zadziała, konieczne może być przejście do ręcznej naprawy w sposób podobny do opisanego powyżej w DragonLord.
źródło
Ten proces opisany w MDN pomógł mi rozwiązać problem polegający na tym, że nowe strony, które odwiedziłem, nie zostały zapisane w historii przeglądarki. Nie miałem pliku
places.sqlite.corrupt
(lubplaces.sqlite-corrupt
), ale sprawdzam jego integralnośćplaces.sqlite
pliku ujawniło, że obraz dysku bazy danych jest nieprawidłowo sformułowany .Zamknij Firefoksa i zrób kopię zapasową swojego profilu Firefox, zanim przejdziesz dalej.
Uruchom Firefox. Historia powinna znów działać.
Jestem na komputerze Mac z przeglądarką Firefox 60.0.1. Konieczne może być dostosowanie poleceń dla platformy.
źródło