Comment récupérer une base de données SQLite3 corrompue?

il s'agit d'une question de suivi à un poste déjà répondu: y a-t-il un utilitaire en ligne de commande pour valider les bases de données SQLite sous Linux?

Si une base de données produit l'erreur suivante:

$ sqlite3 mydata.db "PRAGMA integrity_check"
Error: database disk image is malformed

y a-t-il un traitement de nettoyage qui peut être fait pour récupérer la base de données dans un état utilisable? Même à la perte potentielle de certains corrompus dossiers?

Merci

34
demandé sur Community 2013-08-15 22:57:47

8 réponses

S'il y avait une méthode automatique, SQLite serait déjà en mesure de le faire.

parfois, la corruption est seulement ou la plupart du temps dans les index, dans ce cas, il serait possible d'obtenir une partie ou la plupart des enregistrements en essayant de dumper la base de données entière avec .dump , et utiliser ces commandes pour créer une nouvelle base de données:

$ sqlite3 mydata.db ".dump" | sqlite3 new.db

Cependant, ce n'est pas toujours possible.

le moyen le plus simple et le plus fiable est de restaurer le fichier de base de données de la sauvegarde.

81
répondu CL. 2013-08-15 19:52:19

j'avais un fichier sqlite corrompu qui montrait un symptôme comme celui-ci.

select count(*) from corruptTable;
return:38000;

mais quand j'essayais de charger les enregistrements avec

select * from corruptTable;

il ne retournerait que 7 enregistrements.

j'ai essayé plusieurs choses, mais ces étapes ont été les plus réussies.

sur un mac, ouvrez un terminal et exécutez ces commandes sur votre base de données corrompue. (ce sont des commandes sqlite3, donc vous devriez pouvoir utilisez d'autres éditeurs sqlite3 ou des commandes similaires dans d'autres systèmes).

1 sqlite3 dbWithCorruptTable.sqlite (Obviously replace "dbWithCorruptTable" to your sqlite3 file that has the corrupt table)
2 .mode insert
3 .output dump_all.sql
4 .dump
5 .exit
6 Manually edit the dump_all.sql file in a text editor and remove the transaction statements. Usually there is a "BEGIN TRANSACTION" statement on the 2nd line of the file and a "ROLLBACK" statement on the last line. Remove these and save the file

ces mesures ont été prises à partir de ce site web: http://www.dosomethinghere.com/2013/02/20/fixing-the-sqlite-error-the-database-disk-image-is-malformed /

9
répondu johnrechd 2015-05-20 18:38:57

si la base de données est gravement corrompue, le .dump contiendra des erreurs, et certaines données peuvent être perdues.

pour les schémas de données plus complexes, cela signifiera des enregistrements orphelins et/ou partiels qui peuvent induire en erreur l'application.

C'est peut-être préférable à .dump dans un fichier, puis d'utiliser un éditeur de texte pour supprimer des rangées problématiques. Rechercher ERROR dans le fichier dump.

8
répondu Stavr00 2014-10-24 13:58:01

j'ai pu réparer mon fichier D'historique Chrome (qui est un fichier de base de données sqlite3) de cette façon:

sqlite3.exe History ".backup History-new"
5
répondu Oliver Kötter 2017-01-12 08:02:18

je sais que c'est une vieille question, mais j'aimerais partager ma solution. Mon problème était qu'une base de données sqlite3 de kodi (xbmc) était corrompue

.dump n'a pas fonctionné dans mon cas

file is encrypted or is not a database

ce qui a fonctionné est le suivant.

  1. fait une sauvegarde de l'ancien fichier db
  2. laissez kodi créer un nouveau fichier db
  3. vérifié ce du côté de l'en-tête format de fichiers sqlite
  4. a ouvert les deux fichiers avec un éditeur hexadécimal (bless) et vérifié les 96 premiers octets
  5. les 40 premiers octets où différent et j'ai copié les 40 premiers octets à partir du nouveau fichier db à l'ancien fichier db
  6. après avoir fait cela, mon fichier de base de données a fonctionné à nouveau !!!
3
répondu SuiTheDoc 2015-04-04 12:20:47

quelque chose est partagé dans ce billet de blog - http://wordpress.semnaitik.com/2017/02/01/repair-sqlite-database/

l'auteur dit que nous pouvons corriger la base de données corrompue SQLite manuellement. Comment? Tout d'abord, nous pouvons exporter la base de données SQLite vers le fichier SQL. Et après cela, nous pouvons l'importer à nouveau à SQLite à partir de SQL. Aucune idée si c'est utile ou pas. Vous pouvez essayer une fois. Le billet de blog contient des informations utiles sur la base de données SQLite et sa corruption.

Merci.

1
répondu Stephen 2017-04-07 07:48:11

cela a fonctionné pour moi:

Téléchargez le paquet d'outils sqlite3 de ici et mettez-le dans n'importe quel dossier. Mettez votre base de données corrompue dans le même dossier.

ouvrez une invite de commande.

Type:

sqlite3.exe

(Appuyez Sur Entrée)

nom de votre base de données corrompue>".dump" | sqlite3 nouveau.db

(Appuyez sur Entrée)

toutes les autres solutions n'ont pas fonctionné pour moi.

1
répondu tmighty 2017-05-27 15:47:38

le correctif suivant a fonctionné pour réparer ma base de données sans utiliser d'outils en ligne de commande.

j'ai reçu le message d'erreur" l'image du disque de base de données est malformée "quand je travaillais avec une de mes tables donc j'ai couru [PRAGMA integrity_check] qui est retourné

Principal freelist: gratuit-nombre de pages dans l'en-tête est trop petite

Sur l'arbre de la page 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 dans l'indexName 1

rangée 4493 manquant dans l'indexname2

rangée 4493 manquant dans l'indexname3

j'ai d'abord enregistré le schéma de la table avec les mauvais index pour que je puisse recréer ces index. J'ai ensuite fait tomber les indexindexname 1, 2 et 3 avec la commande [drop index_]. J'ai exporté mes tables une par une à JSON les fichiers et ensuite tronqué chaque table. L'exécution du contrôle d'intégrité à ce moment-là a été couronnée de succès. J'ai ensuite ajouté les trois index avec la commande [create index_] et j'ai importé les enregistrements de chaque table à partir de leur exportation de fichier JSON. L'exécution de la commande vérification de l'intégrité retourne toujours "ok" avec tous les enregistrements restaurés.

0
répondu Gary Z 2018-06-16 06:16:24