修复sqlite3 破损数据库 database disk image is malformed

database disk image is malformed

sqlite是一个文本型数据库,其内部虽然做了异常处理,且官网上也说一般的异常不会引起数据库文件损坏,但是官方还是给出了有可能导致数据库文件损坏的情况。

网上随便一搜database disk image is malformed,发现这问题出现的频率还挺高的,看来sqlite的异常出错几率还是挺高的啊。不过一般来说,sqlite这种类型的数据库也是用在嵌入式设备上较多,用来记录一些读写频率不是很高的场景,例如记录软件的用户配置信息等。

可能的原因猜测

通过打印日志分析,当时正在执行写事务的时候,我们的服务进程异常停止了。服务被拉起之后,再次写同一个数据库文件的时候,就报database disk image is malformed这个错误了,显然此时数据库文件的结构已经出现了异常。因此,推测是写数据库文件时,进程异常停止导致的。

解决方案(命令行手动修复)

网上搜索之后发现,解决方案还是比较简单的,虽然Sqlite本身没有提供修复工具,但是sqlite3.exe提供了dump数据库文件,以及从sql文件中read并写到数据库文件中的操作。

这里的dump命令就是从一个数据库文件CorruptDB中,将其所有执行过的sql语句全部dump下来,并放到一个临时文件tmp.sql中。

可以用sqlite3.exe进行修复,基本操作如下。

打开sqlite3.exe并读取损坏的文件

命令行中执行

sqlite3.exe CorruptDB

打开错误的数据库 此时进入了sqlite命令行环境

导出sql语句到临时文件

sqlite>.output tmp.sql
sqlite>.dump
sqlite>.quit

修改tmp.sql文件

由于数据库文件损坏,所以sqlite自动将tmp.sql最后一行加上了一句Rollback,因此我们需要手动修改tmp.sql文件,将最后一行的Rollback改为Commit;

读取tmp.sql并写入到新库中

D:\Tools\RepairTool>sqlite3.exe NewDB
sqlite>.read tmp.sql
sqlite>.quit

大功告成!

文档信息

版权声明:可自由转载(请注明转载出处)-非商用-非衍生

发表时间:2020年3月27日 14:30