修复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