web-dev-qa-db-fra.com

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

Cette question fait suite à une publication précédente: Existe-t-il un utilitaire de ligne de commande pour valider les bases de données SQLite sous Linux?

Si une base de données génère l'erreur suivante:

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

Existe-t-il un processus de nettoyage à effectuer pour restaurer la base de données dans un état utilisable? Même à la perte potentielle de certains disques corrompus?

Merci

41
linsek

S'il existait une méthode automatique, SQLite serait déjà capable de le faire.

Parfois, la corruption concerne uniquement ou principalement des index, auquel cas il serait possible d'obtenir certains ou la plupart des enregistrements en essayant de vider la base de données entière avec .dump et d'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 consiste à restaurer le fichier de base de données à partir de la sauvegarde.

90
CL.

J'ai eu un fichier sqlite qui était corrompu qui montrerait un symptôme comme celui-ci.

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

Mais quand j'essayais de charger les disques avec 

select * from corruptTable;

Il ne renverrait que 7 enregistrements.

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

Sur un mac, ouvrez le terminal et exécutez ces commandes sur votre base de données corrompue. (Ce sont des commandes sqlite3, vous devriez donc pouvoir utiliser 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 étapes ont été réalisées à partir de ce site Web: Http: //www.dosomethinghere.com/2013/02/20/fixing-the-sqlite-error-the-database-database-disk-image -is-malformed/

12
johnrechd

Si la base de données est sérieusement corrompue, le .dump contient des erreurs et certaines données peuvent être perdues.

Pour les schémas de données plus complexes, cela signifie des enregistrements orphelins et/ou partiels pouvant confondre l'application.

Il peut être préférable de .dump dans un fichier, puis utilisez un éditeur de texte pour supprimer les lignes problématiques. Recherchez ERROR dans le fichier de vidage.

9
Stavr00

J'ai pu réparer mon fichier d'historique Chrome (qui est un fichier de base de données sqlite3) de cette manière:

sqlite3.exe History ".backup History-new"
6
Oliver Kötter

Je sais que c’est une vieille question, mais je voudrais tout de même 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. Sauvegarde de l'ancien fichier db
  2. Laisser Kodi créer un nouveau fichier db
  3. Vérifié sur this side le format d'en-tête des 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 étaient différents et j'ai copié les 40 premiers octets du nouveau fichier de base de données vers l'ancien fichier de base de données.
  6. Après cela, mon fichier de base de données a de nouveau fonctionné !!!
4
SuiTheDoc

Cela a fonctionné pour moi:

Téléchargez le package sqlite3 tools à partir de ici et mettez - le dans n'importe quel dossier. Placez votre base de données corrompue dans le même dossier.

Ouvrez une invite de commande.

Tapez ce qui suit:

sqlite3.exe 

(Appuyez sur Entrée)

NAME_OF_YOUR_CORRUPTED_DATABASE> ".dump" | sqlite3 new.db 

(Appuyez sur Entrée)

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

1
tmighty

Le pragma writable_schema désactive certains contrôles d'intégrité, donc ces deux commandes pourraient également faire l'affaire, en maintenant les personnalisations de la base de données en place:

PRAGMA writable_schema=ON;
VACUUM;
0
Thinkeye

Le correctif suivant a fonctionné pour réparer ma base de données sans exécuter aucun outil de ligne de commande.

J'ai reçu le message d'erreur "L'image du disque de la base de données est mal formée" alors que je travaillais avec l'une de mes tables;

Freelist principale: le nombre de pages libres dans l'en-tête est trop petit

Sur l'arbre page 16198 cellule 1: 2e référence à la page 14190

La page 16988 n'est jamais utilisée

Page 46637 n'est jamais utilisé

ligne 4493 manquante dans l'index indexname1

ligne 4493 manquante dans l'index indexname2

ligne 4493 manquante dans l'index indexname3

J'ai d'abord sauvegardé le schéma de la table avec les mauvais index afin de pouvoir les recréer. J'ai ensuite abandonné les index 1, 2 et 3 avec la commande [drop index _]. J'ai exporté mes tableaux un par un vers des fichiers JSON, puis tronqué chaque tableau. L'exécution de la vérification d'intégrité à ce stade a abouti. J'ai ensuite rajouté les trois index avec la commande [create index _] et importé les enregistrements de chaque table à partir de leur exportation de fichier JSON. L'exécution de la commande de vérification d'intégrité renvoie toujours "ok" avec tous les enregistrements restaurés.

0
Gary Z