修复损坏的SQLite数据库文件(database disk image is malformed)

问题与原因

最近实施那边反馈,有个别客户明明是把数据保存到数据库,但在界面就是没有呈现出来查询不到数据,为了跟踪排查问题与实施沟通后,决定让客户将数据库导出发回来。

在SQLite Stuido工具可以正常查看该表的所有数据,但用sql语句去查询某条数据时却无法正常访问,抛出如下错误:

 Error details: Error while executing SQL query on database  database disk image is malformed

经查出现这种错误,通常是数据库文件损坏造成的,至于为什么会出现SQLite数据库被损坏,官方解释:

SQLite 数据库具有很强的抗损坏性。如果应用程序崩溃,或操作系统崩溃,甚至在事务过程中发生电源故障,则应在下次访问数据库文件时自动回滚部分写入的事务。恢复过程是全自动的,不需要用户或应用程序的任何操作。尽管 SQLite 可以抵抗数据库损坏,但它也不能幸免。 以下任何一种原因可能会损坏数据库文件。

  • 文件被流氓线程或进程覆盖
  • 文件锁定问题,如果没有协调,两个线程或进程可能会尝试同时对数据库文件进行不兼容的更改,从而导致数据库损坏,也就是说多个线程对同一个资源访问,如果不同步数据库可能也会损坏。
  • 同步失败
  • 磁盘驱动器和闪存故障
  • 内存损坏
  • 操作系统问题
  • SQLite 的错误

如何损坏 SQLite 数据库文件

修复数据库

虽然SQLite数据库能够被修复正常使用,但可能会存在数据丢失的问题,对于这种情况也是无能为力啊

进入正题吧,网上有基本上是这两种修复方案:

  • 命令行修复
  • 使用SQLite Expert Professional 的Repair功能进行修复,注意这是专业版,要收费的,不是免费版。

命令行修复

通过dump命令就是从一个原数据库文件中,将其所有执行过的sql语句全部dump下来,并放到一个临时文件tmp.sql中,然后新建一个空数据库文件,通过read命令读取tmp.sql文件将数据写入到空数据库文件中。

一、准备

以windows系统为例,在SQLite的官方网站下载sqlite-tools-win32-x86-3360000.zip
在这里插入图片描述
然后将被损坏的数据拷贝到sqlite-tools-win32-x86-3360000.zip的解压目录下:
在这里插入图片描述

二、命令行打开被损坏的数据库文件

双击sqlite3.exe程序,用.open命令行读取被损坏的数据库文件

sqlite>.open xxx

xxx是数据库名称

三、导出sql语句到临时文件
sqlite>.output tmp.sql
sqlite>.dump
sqlite>.quit

tmp.sql文件生成在sqlite-tools-win32-x86-3360000目录下

在这里插入图片描述

四、 修改tmp.sql文件与写入到空数据库中

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

用记事本或其他软件将tmp.sql文件打开修改,然后保存。
在这里插入图片描述
再次双击打开sqlite3.exe,使用.open命令行创建一个空数据库

sqlite> .open newDB.db

会生成一个空数据库newDB.db
在这里插入图片描述
接着使用.read命令行读取tmp.sql并写入到空数据库中。

sqlite>.read tmp.sql
sqlite>.quit

在读取tmp.sql文件中可能报错,根据提示找到目标行数修改并保存,再执行命令行.read;如果在写入中没有报错就不用去修改tmp.sql文件中sql语句,这是理想的状态。

sqlite> .read tmp.sql
Error: near line 33524: UNIQUE constraint failed: log_data.id
Error: near line 33525: UNIQUE constraint failed: log_data.id
Error: near line 33526: UNIQUE constraint failed: log_data.id
Error: near line 33527: UNIQUE constraint failed: log_data.id
Error: near line 33528: UNIQUE constraint failed: log_data.id
Error: near line 33529: UNIQUE constraint failed: log_data.id
Error: near line 33530: UNIQUE constraint failed: log_data.id
Error: near line 33531: UNIQUE constraint failed: log_data.id
Error: near line 33532: UNIQUE constraint failed: log_data.id
Error: near line 33533: UNIQUE constraint failed: log_data.id

到这里就完成数据库的修复,在newDB.db数据库文件就会有数据了,虽然修复了,文件的大小却小了,很明显有数据丢失。
在这里插入图片描述

SQLite Expert Professional 修复

之前一直使用SQLiteStudio GUI可视化软件来查看数据库,有一个很好导出功能。

SQLite Expert Professional专业版的安装与注册,专业版是收费的,如何绕过,请参考这篇:SQLite Expert安装与注册

用SQLite Expert Professional修复就很简单了,打开待修复的数据库文件,然后选择Repair功能即可
在这里插入图片描述
点击Repair,选择修复后数据库导出的目录与名称。

在这里插入图片描述
如果数据库文件比较大的话,会修复等待的时间会长些。修复前后的文件对比:
在这里插入图片描述
与命令行修复相比,文件大小更小些,可预见丢失的数据会更多,实际也确实是这样的,个人建议还是使用命令行修复,虽然操作复杂些,但数据更珍贵。

参考

https://www.sqlite.org/howtocorrupt.html
https://blog.csdn.net/fangye945a/article/details/94762526
https://www.jianshu.com/p/d2c53d654e4a

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据库磁盘映像格式错误通常发生在数据库文件损坏或意外中断导致文件结构损坏时。为了修复这个问题,可以尝试使用以下数据库修复工具。 1. SQLite中的sqlite3工具:SQLite是一种轻量级的嵌入式数据库引擎,它包含了一个命令行工具sqlite3,可以用于对SQLite数据库进行操作和修复。可以尝试使用sqlite3工具进行修复操作,方法如下: - 打开命令行界面。 - 导航到包含损坏数据库的目录。 - 运行以下命令:`sqlite3 your_database.db` - 进入SQLite命令提示符后,输入 `.mode insert` 和 `.output fixed_db.sql` 命令,将数据库内容导出到一个新的SQL文件中。 - 退出SQLite命令提示符,然后输入 `.exit` 命令。 - 再次进入命令行界面,导航到包含新导出SQL文件的目录。 - 运行以下命令:`sqlite3 fixed_database.db < fixed_db.sql`,将新导出的SQL文件导入到一个新的修复数据库中。 - 在导入完成后,可以使用新的修复数据库。 2. DB Browser for SQLite:这是一个免费的SQLite数据库管理工具,它提供了许多高级功能,包括修复数据库的功能。可以下载并安装这个工具,然后使用以下步骤修复数据库: - 启动DB Browser for SQLite。 - 点击"Open Database"按钮,选择损坏数据库文件。 - 在工具栏中选择“Database”选项卡,然后选择“Check Integrity”选项。 - 弹出一个对话框,点击“OK”开始检查和修复数据库。 - 修复完成后,可以尝试重新打开修复后的数据库文件。 这些数据库修复工具都是针对SQLite数据库的特定工具,可以帮助修复损坏数据库文件。鉴于数据库的复杂性和不确定性,可能并不是所有情况下都可以成功修复,因此建议在操作前备份损坏数据库文件,以防万一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值