Ripara ora
- Trascina il file
- La riparazione avviene in locale
- Scarica il risultato
places.sqlite è l'unico database SQLite in cui Firefox conserva tutta la tua cronologia di navigazione, ogni segnalibro, oltre a tag, parole chiave e annotazioni delle pagine. Quando si guasta, o vedi Firefox reimpostarsi in silenzio — i segnalibri riappaiono ma la cronologia è sparita — oppure uno strumento segnala "database disk image is malformed" (immagine su disco del database malformata). Questo è il SQLITE_CORRUPT di SQLite (codice di risultato 11): una pagina o un puntatore si è rotto e il motore rifiuta l'intero file, anche se le tue righe di solito restano intatte nelle loro pagine foglia. Rilascia places.sqlite (o il file places.sqlite.corrupt che Firefox ha lasciato) qui sopra e il recupero percorre le pagine nel tuo browser, ricostruisce lo schema e scrive un database nuovo che si apre davvero, senza caricare nulla.
Cosa contiene places.sqlite e cosa si è rotto davvero
Tutto il sistema di segnalibri e cronologia di Firefox vive in un solo file. moz_places conserva una riga per ogni URL che hai visitato o aggiunto ai segnalibri: il suo url, il suo title, rev_host (l'host invertito, per raggruppare rapidamente i domini), visit_count, last_visit_date, un guid, un url_hash e frecency, un punteggio esclusivo di Firefox che combina frequenza e recenza (frequency + recency) e ordina i suggerimenti della barra degli indirizzi. Ogni singola visita è una riga in moz_historyvisits, il cui place_id rimanda a moz_places.id. Il tuo albero dei segnalibri è moz_bookmarks: ogni riga porta un parent, una position, un title, un guid e una chiave esterna fk verso moz_places. L'albero pende da cartelle radice fisse con guid permanenti di 12 caratteri: root________, menu________ (Menu dei segnalibri), toolbar_____ (Barra dei segnalibri), unfiled_____ (Altri segnalibri), mobile______ e tags________. Intorno a esse ci sono moz_origins, moz_keywords, le tabelle di annotazioni moz_anno_attributes/moz_annos/moz_items_annos, moz_inputhistory e moz_meta. I favicon non sono qui: dalla versione 55 di Firefox vivono in un favicons.sqlite separato, nello stesso profilo.
Fisicamente, il file è un array piatto di pagine di dimensione fissa. Firefox crea places.sqlite con una dimensione di pagina di 32 KiB (PRAGMA page_size = 32768, compilata come SQLITE_DEFAULT_PAGE_SIZE) — otto volte il valore predefinito di 4 KiB di SQLite — e lo esegue in modalità WAL, quindi accanto vedrai due file gemelli: places.sqlite-wal (il registro di scrittura anticipata, il write-ahead log) e places.sqlite-shm (un indice in memoria condivisa). La pagina 1 contiene l'intestazione e lo schema; ogni tabella e indice è un b-tree le cui pagine interne puntano verso il basso alle pagine foglia che contengono le tue righe.
Questi puntatori sono il punto debole. Una scrittura interrotta, un guasto a metà di un checkpoint, un disco pieno, un settore difettoso o un byte capovolto in una pagina interna da 32 KiB bastano: SQLite segue il puntatore, trova qualcosa che non è una pagina valida e dichiara malformata l'intera immagine, mentre le tue righe restano intatte nelle pagine foglia che non ha mai raggiunto. A rompersi è stata la mappa, non i dati.
Cosa fa Firefox quando rileva la corruzione, e perché la cronologia sparisce
Firefox controlla places.sqlite all'avvio. Se l'apertura si scontra con SQLITE_CORRUPT o fallisce un controllo di integrità, il servizio Places tratta il file come inservibile e fa qualcosa di drastico senza chiedere: rinomina places.sqlite in places.sqlite.corrupt nella cartella del profilo, crea un places.sqlite nuovo e vuoto e poi ripristina i segnalibri dal file con la data più recente nella cartella bookmarkbackups: bookmarks-YYYY-MM-DD_<count>_<hash>.jsonlz4, compresso con il mozLz4 di Mozilla (un'intestazione magica di 8 byte mozLz40\0, poi una dimensione decompressa di 4 byte in little-endian e infine un blocco LZ4; non è LZ4 standard, quindi gli strumenti normali non lo aprono).
Ecco l'inghippo che spinge le persone a cercare una soluzione: viene fatto il backup solo dei segnalibri. La cronologia, i punteggi di frecency, le parole chiave e la cronologia di digitazione non vengono mai scritti in quei file .jsonlz4, quindi un reset ricostruisce in silenzio il tuo albero dei segnalibri e scarta tutto il resto. I segnalibri tornano con un bell'aspetto; mesi o anni di cronologia semplicemente spariscono dal database attivo.
Le stringhe di errore che vedrai davvero, e cosa significano: database disk image is malformed (immagine su disco del database malformata) è SQLITE_CORRUPT (codice di risultato 11): una pagina danneggiata, un offset di cella errato o un conteggio delle pagine che non concorda con la dimensione del file. file is not a database (il file non è un database) è SQLITE_NOTADB (codice 26): l'intestazione magica di 16 byte SQLite format 3\000 è danneggiata, anche se le pagine dietro di essa sono spesso intatte. E The bookmarks and history system will not be functional because one of Firefox's files is in use by another application (il sistema dei segnalibri e della cronologia non funzionerà perché uno dei file di Firefox è in uso da un'altra applicazione) è tutt'altra cosa: è un blocco (SQLITE_BUSY), di solito un secondo processo di Firefox o un antivirus che tiene occupato il file, non una corruzione. Poiché la rinomina avviene in modo automatico, quando ti accorgi della barra vuota i dati buoni sono già in places.sqlite.corrupt e il places.sqlite attivo è vuoto.
Come il recupero lo ricostruisce in locale
Invece di rattoppare il file rotto sul posto, lo strumento legge direttamente le sue pagine da 32 KiB, ricostruisce lo schema a partire dalla pagina 1, percorre il b-tree di ogni tabella e ricorre a una scansione grezza delle pagine senza puntatori per le righe che i puntatori rotti non riescono più a raggiungere: la stessa strategia del comando .recover di SQLite. I record che non possono essere attribuiti a una tabella conosciuta vengono collocati in una tabella lost_and_found anziché essere scartati, così una riga rovinata di moz_places o moz_bookmarks viene conservata invece di perdersi. Se hai ancora il file gemello places.sqlite-wal, aggiungilo nello slot opzionale: in modalità WAL, le visite e i segnalibri più recenti possono vivere solo in quel registro finché non viene fatto il checkpoint, e i suoi frame confermati vengono sovrapposti prima della scansione. Il risultato è un places.sqlite nuovo che si apre davvero e che scarichi: copialo di nuovo nel profilo con Firefox chiuso, oppure aprilo in modalità sola lettura per esportare segnalibri e cronologia.
Usa il file places.sqlite.corrupt se Firefox ha già reimpostato il tuo profilo: è lì che si trova ancora la tua cronologia. Per trovarlo, apri about:profiles e premi "Apri cartella" (Open Directory, cartella radice) del profilo in uso, oppure vai direttamente in %APPDATA%\Mozilla\Firefox\Profiles\<nome> su Windows, ~/Library/Application Support/Firefox/Profiles/<nome> su macOS o ~/.mozilla/firefox/<nome> su Linux. Copia il file altrove con Firefox completamente chiuso, così nulla lo tiene bloccato.
Perché tutto questo non deve essere caricato: places.sqlite è, letteralmente, un registro completo di ogni pagina che hai visitato. È il file che meno vorresti vedere copiato sul server di un'azienda di riparazione "solo per sistemarlo", secondo condizioni di conservazione che non hai mai letto. Qui viene letto dal tuo disco e ricostruito nella scheda del browser: puoi aprire il pannello Rete (Network) e verificare che 0 byte del database lascino mai il tuo computer.
Cosa può e cosa non può riparare
Può riparare
- "database disk image is malformed" causato da una pagina da 32 KiB danneggiata o da un puntatore b-tree rotto, quando sopravvivono le pagine foglia che contengono le tue righe
- La cronologia che Firefox scarta al reset: le righe di moz_places e moz_historyvisits estratte dal file anche dopo un ripristino dei soli segnalibri
- Il file places.sqlite.corrupt che Firefox ha rinominato reimpostando il tuo profilo
- Un'intestazione danneggiata ("file is not a database") quando le pagine dietro la firma magica di 16 byte di SQLite sono intatte
- Visite e segnalibri senza checkpoint da un file gemello places.sqlite-wal fornito
Non può riparare
- Righe fisicamente sovrascritte o troncate alla fine del file: quei byte non esistono più
- Un places.sqlite che Firefox ha già sostituito con un database nuovo e vuoto (recupera invece il file .corrupt rinominato)
- Ricostruire i favicon: vivono in un favicons.sqlite separato; recupera quel file per conto suo
- Decomprimere un backup dei segnalibri .jsonlz4: è un archivio mozLz4, non un database SQLite (importalo dalla Libreria di Firefox stessa)
- Un file da 0 byte, o uno che è rumore ad alta entropia da cima a fondo (prima è un lavoro di recupero dati del dispositivo di archiviazione)
Se una riparazione fallisce, ti diciamo perché (dati mancanti rispetto a struttura danneggiata), e non ti viene mai addebitato nulla per una riparazione fallita.