Comment réparer une base de données Firefox places.sqlite corrompue?

15

J'ai eu quelques problèmes avec ma RAM (écran bleu plusieurs fois, Windows XP) et maintenant mes bases de données Firefox sont endommagées. Firefox fonctionne, mais mon historique a disparu et il signale plusieurs incohérences et erreurs lors de l'exécution pragma integrity_checksur places.sqlite:

l'image du disque de la base de données est mal formée

Maintenant, la question, comment réparer les bases de données SQLite?

Policier
la source
2
Pour référence future, la FEBE (Firefox Environment Backup Extension) peut être utile à l'avenir. Copie l'intégralité du profil et le conditionne en une seule sauvegarde. Je sais que cela ne répond pas à votre question, mais il pourrait être utile de le savoir à l'avenir. bit.ly/aumThw
Urda
Modifié pour aider les Googleurs à trouver cette question.
bwDraco

Réponses:

22

Remarque

Étant donné que Firefox doit être fermé pour effectuer cette procédure, assurez-vous d'ouvrir cette page dans un autre navigateur Web ou de l'imprimer avant de continuer.


Après des heures de travail à essayer de récupérer la base de données Places, même en lisant le code source de Firefox, j'ai réussi à réussir. Voici comment je l'ai fait:

  • Téléchargez la dernière version du shell SQLite et extrayez-la dans votre dossier de profil. Sous Windows Vista et Windows 7, il se trouve dans le C:\Users\<username>\AppData\Roaming\Mozilla\Firefox\Profiles\<code>.defaultdossier.
  • Fermez Firefox s'il est en cours d'exécution.
  • La base de données Places se trouve dans le places.sqlitefichier. Si le fichier a été remplacé en raison d'une corruption, utilisez le places.sqlite.corruptfichier pour la récupération. Créez une copie de sauvegarde du fichier, nommée places.sqlite.bakou places.sqlite.corrupt.bak.
  • Utilisez le shell SQLite pour ouvrir le fichier de base de données ( sqlite3 places.sqliteou sqlite3 places.sqlite.corrupt), puis entrez:
.output dump.sql    -- sends output to file dump.sql
.dump               -- dumps database to file
  • Étant donné que la base de données est corrompue, le vidage de base de données résultant n'est pas terminé et toutes les données récupérables n'ont pas été récupérées. Pour déterminer où l'erreur s'est produite, recherchez le mot ERROR(toutes majuscules) dans un commentaire SQL à l'intérieur du fichier de vidage dump.sql(j'ai utilisé Notepad ++ pour ce faire) et lisez la INSERTcommande SQL au-dessus pour déterminer la table en question. Dans mon cas, la table endommagée est moz_places. (Une description des tables trouvées dans la base de données Places peut être trouvée ici , qui inclut un diagramme ER obsolète.) Je vais expliquer comment récupérer des données supplémentaires à partir de cette table uniquement; la procédure suivante n'est probablement pas applicable pour les autres tables, donc ignorez ces sous-étapes si une table autre que celle-ci moz_placesest impliquée.)

    • Chaque ligne du moz_placestableau a un ID. Les lignes sont vidées du tableau suivant l'ordre de cet ID. 1 L'ID est la première valeur suivant la parenthèse ouvrante dans l' INSERTinstruction. La zone où la base de données est endommagée est susceptible d'être un petit bloc de lignes dans ce tableau; l'idée ici est de sauter cette zone endommagée et de récupérer autant de données que possible. La zone de début d'un tel bloc est représentée dans le vidage comme la ligne avant que le ERRORcommentaire n'apparaisse. En utilisant l'ID de cette ligne, nous pouvons déterminer où la base de données est endommagée. Nous le faisons en utilisant des SELECTinstructions avec l'ID comme condition; ce processus prend quelques essais et erreurs. Par exemple, si le dernier ID avant l'erreur était 49999 et que l'erreur suit, le bloc endommagé commence à l'ID 50000. Utilisez des instructions telles que:

    - supprimer la sortie inutile
    - la commande suivante est pour les systèmes Windows
    - pour Linux et autres systèmes Unix et de type Unix, utilisez .output / dev / null
    .output NUL
    
    SELECT id FROM moz_places WHERE id> = 50100;
    
    • Ajustez la valeur en suivant la id >=et répétez la SELECTcommande ci-dessus jusqu'à ce que vous trouviez la plus petite valeur qui ne provoque pas la sortie d'une erreur par SQLite. Il s'agit de l'ID qui fait référence à la ligne à partir de laquelle nous pouvons récupérer des données supplémentaires. Supposons que cet ID soit 50200. Pour vider ces données, entrez:

    .output dump2.sql
    insert .mode
    SELECT * FROM moz_places WHERE id> = 50200;
    
    - restaurer un comportement de sortie normal
    .output stdout
    Liste .mode
    
    • Notez que les INSERTinstructions du dump2.sqlfichier commencent par INSERT INTO table VALUES, utilisez donc la fonction Rechercher et remplacer dans votre éditeur de texte pour remplacer toutes les instances de cette chaîne par INSERT INTO moz_places VALUES.
    • Copiez l'intégralité du contenu du dump2.sqlfichier et collez-le dans le dump.sqlfichier où le ERRORcommentaire apparaît.
  • Remplacez le ROLLBACK; -- due to errorsà la fin du fichier par COMMIT;.
  • Ajoutez le code suivant en haut du dump.sqlfichier. Remplacez <version>par la valeur correcte, qui est requise pour que Firefox détermine la version du schéma de base de données en fonction de la version de Firefox, comme suit (cela peut être trouvé dans le fichier source de Firefox toolkit/components/places/Database.cpp):
    • Firefox 52: schéma version 35
    • Firefox 53: schéma version 36
    • Firefox 57: schéma version 39
    • Firefox 58: schéma version 41
    • Firefox 60: schéma version 43
    • Firefox 61: schéma version 47
    • Firefox 62: schéma version 52
    • Firefox 69: schéma version 53

PRAGMA user_version = <version>;
PRAGMA journal_mode = tronqué;
PRAGMA page_size = 32768;
VIDE;
PRAGMA journal_mode = wal;
  • Quittez le shell SQLite, supprimez places.sqlite, puis démarrez le shell SQLite en créant une places.sqlitebase de données vide à l' aide de sqlite3 places.sqlite. Tapez .read dump.sqlpour charger le vidage SQL dans la base de données.
  • Démarrez Firefox et confirmez que votre historique et votre barre d'emplacement fonctionnent comme prévu. Une fois que vous avez confirmé que tout va bien, supprimez les fichiers de vidage de la base de données et l'exécutable du shell SQLite du dossier de profil.

Des informations plus pertinentes sont disponibles sur les pages suivantes:

Une procédure simplifiée est décrite dans cet article MDN mais je ne l'ai pas testée. Néanmoins, j'ai incorporé des PRAGMAcommandes mises à jour de cet article.


1 SQL ne garantit normalement pas que la sortie de la base de données sera donnée dans n'importe quel ordre, sauf si vous utilisez la ORDER BYclause. Cependant, ORDER BYne produira probablement aucune sortie sur une base de données corrompue (car SQLite devra lire la table entière avant de pouvoir produire une sortie). Pour autant que je sache, Firefox écrit toujours moz_placesles entrées de table avec des ID séquentiels, nous pouvons donc supposer que toutes les sorties sont ordonnées par ID.

bwDraco
la source
3
C'est de la pure génialité. M'a aidé à récupérer presque toute l'histoire d'un places.sqlite corrompu. Merci beaucoup!!
Ashutosh Jindal
Cela a aidé, avec deux modifications: 1) ajouter un ";" dans la ligne user_version; 2) pour une raison quelconque, mon fichier "corrompu" avait une version de schéma qui était "une de moins" que prévu. Après que votre méthode n'ait pas fonctionné initialement, j'ai essayé d'importer le cliché dans la nouvelle base de données de 10 Mo et j'ai échoué car l'ancienne table avait une colonne de moins. Un regard sur le lien du code source m'a fait comprendre ce qui se passait. Post génial !!!
Tilman Hausherr
@TilmanHausherr: adressé. Pour éviter le problème de changement de colonne, assurez-vous de suivre les étapes de cette réponse dès que vous remarquez une corruption et avant de mettre à jour Firefox, afin que le schéma de la base de données ne soit pas modifié. Vous pouvez également essayer de définir une ancienne version de schéma: Firefox la mettra à jour vers la nouvelle version lorsque vous restaurerez la base de données.
bwDraco
La définition de la version précédente du schéma est ce que j'avais fait lors de l'écriture de mon premier commentaire, c'est-à-dire que j'avais déjà réussi :-) Ouais, je soupçonne que je n'avais pas remarqué la corruption immédiatement, je ne le remarque généralement qu'en entrant des caractères qui devraient faire un "ancienne URL" apparaît et rien ne se passe.
Tilman Hausherr
Excellent travail! Heureux que vous l'ayez mis à jour, ce qui l'a remis dans les questions actives où je l'ai repéré.
fixer1234
4

Eh bien, en fonction de son endommagement, la réparation peut ne pas être possible. Votre meilleur pari est probablement d'essayer de vider la base de données en utilisant sqlite, puis de voir ce que vous pouvez récupérer.

Si cela échoue, vous devrez probablement restaurer à partir de la sauvegarde.

Pour vider et recréer une base de données, utilisez la commande .dump:

sqlite places.sqlite .dump | sqlite places-new.sqlite
sleske
la source
1
Je vous remercie. Le message SO n'a pas été utile car il n'a pas fonctionné, mais la solution référencée dans le lien a fonctionné d:\sqlite3.exe d:\idimager.cat.db .dump | d:\sqlite3.exe d:\newdb.cat.db. Tous les favicons ont maintenant disparu, mais moi ils se reconstruisent en visitant les sites. Merci encore!
Bobby
stackoverflow.com/questions/2255305/… le lien dans la question ci-dessus, a été volontairement supprimé par son auteur. La réponse ci - dessous peut être utile.
user66001
@ user66001: Oui, l'OP a supprimé sa question. J'ai copié la commande appropriée.
sleske
Cela n'a pas fonctionné pour moi et je me suis retrouvé avec un places.sqlite.corruptfichier. J'ai posté une autre réponse avec une solution qui a fonctionné pour moi.
Daniel
2

Comme toujours pour effectuer une réparation comme celle-ci, je vous recommande de faire au moins une copie de sauvegarde de votre fichier places.sqlite situé dans votre répertoire de profil. Avoir une sauvegarde vous permet d'essayer différentes choses pour réparer de tels problèmes tout en sachant que si la réparation tentée aggrave les choses, vous pouvez toujours faire une autre copie de la sauvegarde sur laquelle réessayer.

Selon ce qui est corrompu et à quel point il est corrompu, il peut être possible de résoudre les problèmes avec l'extension Places Maintenance . J'ai fini avec un fichier places.sqlite corrompu à quelques reprises. Places Maintenance a pu résoudre le problème à chaque fois en exécutant divers des contrôles / correctifs qu'il fournit en tant qu'opérations dans sa boîte de dialogue d'options. Les différents contrôles et / ou rapports ne devraient prendre que quelques instants à quelques minutes.

Si cela ne fonctionne pas, il peut être nécessaire de suivre la voie de la correction manuelle d'une manière similaire à ce que DragonLord décrit ci-dessus.

Makyen
la source
1

Ce processus décrit sur MDN m'a aidé à résoudre un problème où les nouvelles pages que j'ai visitées n'étaient pas enregistrées dans l'historique du navigateur. Je n'avais pas de fichier places.sqlite.corrupt(ou places.sqlite-corrupt), mais la vérification de l'intégrité de mon places.sqlitefichier a révélé que l' image disque de la base de données était une erreur de forme.

Quittez Firefox et sauvegardez votre profil Firefox avant d'aller plus loin ici.

$ cd /Users/<username>/Library/Application\ Support/Firefox/Profiles/<profile_dir>/
$ cp places.sqlite places.sqlite.bak  # for safety

$ sqlite3 places.sqlite
sqlite> PRAGMA integrity_check;
*** in database main ***
On tree page 2 cell 131: Rowid 20884 out of order
...
Error: database disk image is malformed
sqlite> .clone places-clone.sqlite
moz_places... done
moz_historyvisits... done
... more output like above plus a few errors (which I ignored) like
sqlite_sequence... Error: object name reserved for internal use: sqlite_sequence
SQL: [CREATE TABLE sqlite_sequence(name,seq)]
done
...
sqlite> PRAGMA user_version;
43  <----- TAKE NOTE OF THIS VALUE it may be different for you
sqlite> .exit

$ sqlite3 places-clone.sqlite
sqlite> PRAGMA integrity_check;
ok
sqlite> PRAGMA user_version = 43;  -- use the number you got from PRAGMA user_version; above
sqlite> PRAGMA journal_mode = truncate;
truncate
sqlite> PRAGMA page_size = 32768;
sqlite> VACUUM;
sqlite> PRAGMA journal_mode = wal;
wal
sqlite> .exit

$ mv places-clone.sqlite places.sqlite

Démarrez Firefox. L'histoire devrait fonctionner à nouveau.

Je suis sur un Mac avec Firefox 60.0.1. Vous devrez peut-être ajuster les commandes de votre plate-forme.

Daniel
la source
Merci Daniel, toujours utile de voir la procédure de commande réelle
not2qubit