当用程序查询一个Sqlite3数据库时,如果出现
database disk image is malformed
则说明sqlite数据库的某个表中有一部分记录有问题,导致无法select,update或者delete
但出现这种错误的时候,insert是可以进行的


似乎Sqlite3本身并没有提供任何的恢复机制
但通过Sqlite3提供的命令行工具,应该是能恢复其中的正常数据的
以下是操作步骤:


首先从损坏的数据库中dump数据库

sqlite3 Maildir.sqlite3

SQLite version 3.5.6

Enter ".help" for instructions

sqlite> .tables

folders  mails

sqlite> select count(*) from mails;

SQL error: database disk image is malformed

sqlite> .output data.sql

sqlite> .dump



然后新建一个sqlite库,并导入刚才的数据库

sqlite3 new.sqlite3

sqlite> .read data.sql

sqlite> .tables

folders  mails  

sqlite> select count(*) from mails;

25


更简单的一个shell脚本命令:

echo '.dump' | sqlite3 db.bad |sqlite3 db.new