94 votes

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

Il s'agit d'une question de suivi d'un message auquel il a été répondu précédemment : Existe-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 effectué pour remettre la base de données dans un état utilisable ? Même au prix de la perte potentielle de certains enregistrements corrompus ?

Merci

155voto

CL. Points 46451

UPDATE : Il y a maintenant un méthode automatique qui est intégré dans SQLite : .recover

Parfois, la corruption se situe uniquement ou principalement dans les index, auquel cas il est possible d'obtenir certains ou la plupart des enregistrements en essayant de vider la base de données entière à l'aide de la commande .dump et utilisez ces commandes pour créer une nouvelle base de données :

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

Toutefois, cela n'est pas toujours possible.

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

55voto

arun Points 1030

Avec Sqlite 3.29.0 une nouvelle .recover a été introduite dans l'interface CLI :

Ajoutez la commande ".recover" qui tente de récupérer autant de contenu que possible. possible d'un fichier de base de données corrompu.

sqlite3 broken.db ".recover" | sqlite3 new.db

25voto

johnrechd Points 614

J'avais un fichier sqlite qui était corrompu et qui montrait un symptôme comme celui-ci.

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

Mais lorsque j'essaie de charger les enregistrements avec

select * from corruptTable;

Il ne renvoie 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 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 sont tirées de ce site Web : http://www.dosomethinghere.com/2013/02/20/fixing-the-sqlite-error-the-database-disk-image-is-malformed/

16voto

Federico Firenze Points 141

Ma méthode est similaire, empêche une erreur rollback script :

sqlite3 database.db ".dump" | sed -e 's|^ROLLBACK;\( -- due to errors\)*$|COMMIT;|g' | sqlite3 database.new

12voto

user3434508 Points 1

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

Pour les schémas de données plus complexes, cela se traduira par des enregistrements orphelins et/ou partiels qui risquent de perturber 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X