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
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.
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/
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.
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"
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.
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.
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;
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.