Comment faire pour récupérer une corrompre la base de données SQLite3?
C'est une question de suivi à un déjà répondu post: Est-il un utilitaire de ligne de commande pour valider les bases de données SQLite dans Linux?
Si une base de données produit l'erreur suivante:
$ sqlite3 mydata.db "PRAGMA integrity_check"
Error: database disk image is malformed
Est là tout le nettoyage de traitement qui peut être fait pour récupérer la base de données à un état utilisable? Même à la perte potentielle de certains corrompus dossiers?
Grâce
Vous devez vous connecter pour publier un commentaire.
S'il n'y avait aucune méthode automatique, SQLite, ce serait déjà capable de le faire.
Parfois, la corruption est seulement ou principalement dans les index, auquel cas il serait possible d'obtenir certains ou la plupart des enregistrements en essayant de faire un dump de la base de données entière avec
.dump
, et d'utiliser ces commandes pour créer une nouvelle base de données:Cependant, ce n'est pas toujours possible.
La méthode la plus simple et la plus fiable est de restaurer le fichier de base de données à partir de la sauvegarde.
J'ai eu un fichier sqlite qui a été corrompu, qui montrera l'un des symptômes de ce genre.
Mais lorsque je tente de charger les enregistrements avec
Il ne serait de retour 7 dossiers.
J'ai essayé plusieurs choses, mais ces mesures ont le plus de succès.
Sur un mac, ouvrez le terminal et exécutez ces commandes sur votre base de données corrompue. (ce sont sqlite3 commandes, donc vous devriez être en mesure d'utiliser d'autres sqlite3 des éditeurs ou des commandes similaires dans d'autres systèmes).
Ces mesures ont été prises à partir de ce site:
http://www.dosomethinghere.com/2013/02/20/fixing-the-sqlite-error-the-database-disk-image-is-malformed/
Si la base de données est sérieusement endommagée, le
.dump
va contenir des erreurs, et certaines données peuvent être perdues.Plus complexes, les schémas de données, cela signifie orphelins et/ou partielle des dossiers, ce qui peut perturber l'application.
Il peut être préférable de
.dump
à un fichier, puis d'utiliser un éditeur de texte pour supprimer des rangées problématiques. Recherche pourERROR
dans le fichier de vidage.J'ai pu réparer mon Chrome fichier de l'historique (qui est un fichier de base de données sqlite3) de cette façon:
Je sais que c'est une vieille question, mais j'aimerais partager ma solution.
Mon problème était que d'une base de données sqlite3 pour kodi(xbmc) a été endommagé.
.dump ne fonctionne pas dans mon cas
file is encrypted or is not a database
Ce qui a fonctionné a été le suivant:
Ma méthode est similaire, empêche une erreur de script de restauration:
Cela a fonctionné pour moi:
Télécharger le sqlite3 package d'outils de ici et le mettre dans un dossier quelconque. Mettez votre base de données corrompues dans le même dossier.
Ouvrez une invite de commande.
Tapez la commande suivante:
sqlite3.exe
(Appuyez Sur Entrée)
NAME_OF_YOUR_CORRUPTED_DATABASE> ".dump" | sqlite3 nouveau.db
(Appuyez sur entrée)
Toutes les autres solutions ne fonctionnent pas pour moi.
Le pragma
writable_schema
désactive certaines vérifications de l'intégrité, de sorte que ces deux commandes peuvent également faire l'affaire, en gardant db personnalisations en place:Le correctif suivant travaillé à réparer ma base de données sans exécuter les outils de ligne de commande.
J'ai eu la "base de données d'image de disque est mal formé" message d'erreur lorsque je travaillais avec une de mes tables j'ai donc couru [PRAGMA integrity_check] qui a retourné
Principal freelist: gratuit-nombre de pages dans l'en-tête est trop petite
Sur la page d'arborescence 16198 cellule 1: 2ème référence à la page 14190
Page 16988 n'est jamais utilisé
Page 46637 n'est jamais utilisé
ligne 4493 manquant à partir de l'index indexname1
ligne 4493 manquant à partir de l'index indexname2
ligne 4493 manquant à partir de l'index indexname3
J'ai d'abord enregistré le schéma de la table avec le mauvais indices afin que je puisse recréer les index. J'ai ensuite laissé tomber la indexname 1, 2, et 3 d'index avec le [drop index _] commande. J'ai exporté mes tableaux, un par un pour fichiers JSON et puis tronqué chaque table. L'exécution de la vérification de l'intégrité à ce moment a été un succès. J'ai ensuite ajouté les trois indices de retour avec le bouton [create index _] commande et importés de chaque table les dossiers à partir de leur fichier JSON à l'exportation. L'exécution de la vérification de l'intégrité de commande est toujours en retour "ok" avec tous les enregistrements restauré.
J'ai fixé la base de données de la corruption causée par l'absence d'index avec ces étapes, et ils travaillent pour moi.
DROP Index: sqlite drop index de commande
Run vide Sqlite vide de commande
Recréer l'index de nouveau : Sqlite créer des index