【SQL】sqlite数据库损坏报错:database disk image is malformed(已解决)

目录

0.背景

1.数据库修复思路

2.具体修复步骤

1)在官网下载数据库工具sqlite3:

2)在损坏数据库的文件夹内,打开终端

3)用sqlite3打开受损的数据库,并用SQL语句的形式导出数据库中的数据和结构

4)新建一个数据库

5)将第三步生成的SQL语句文件【test.sql】导入新的数据库,生成新的结构和数据

6)改名


0.背景

医疗仪器,搭载linux系统,界面是用qt做的应用,用的是sqlite数据库,数据库名为【POCT_CUSTOM.db】,近期发生多次数据库报错损坏,也询问了前辈该如何修复,成功修复后,特此整理总结,希望帮助到其他遇到问题的小伙伴。

我的数据库出错,体现在客户端就是无法读出数据显示在桌面,应有的数据栏为空。

我用navicat工具分析时,错误总共分为以下三种情况

1)数据库中写入了不规则的非法数据,此时只要打开数据库,删除掉非法数据行即可正常读取;

2)数据库中的某个表(如PATIENT表)损坏,打开此表时会报错(如下图),我是通过新建一个数据库表(PATIENT表),然后将原表中的数据复制过来,然后删除原表(其实就是进行一个替换),即可正常读取;

3)还有一种就是数据库表都未损坏,可正常插入删除,但是客户端界面就是无法读取数据,通过询问前辈,他们说可能是因为在数据库写入的过程中,仪器断电后可能会导致数据库表损坏,用的就是以下的方式修复好的(相当于拿到原有的数据库,然后重新生成一个数据库),详见下文

数据库损坏还有很多原因,具体可参见官网:

How To Corrupt An SQLite Database File

1.数据库修复思路

1)使用工具【sqlite3】,打开需修复的数据库,用SQL语句的形式导出数据库中的数据和结构,将SQL语句保存到dump文件中,会输出一个.sql文件(如dump.sql)

2)手动创建一个数据库,如new.db

3)将dump.sql数据导入到新的数据库(new.db)中

4)改名,将新的数据库改名为原本项目中使用的数据库名(POCT_CUSTOM.db)

2.具体修复步骤

1)在官网下载数据库工具sqlite3:

SQLite Download Page

因为我的编译环境是windows,所以下的是windows-x64版本,找自己合适的就行

下载安装的过程我就不赘述了,可以参考以下博客:

SQLite的安装与命令行使用(1)-CSDN博客

2)在损坏数据库的文件夹内,打开终端

3)用sqlite3打开受损的数据库,并用SQL语句的形式导出数据库中的数据和结构

具体命令及含义如下:

sqlite3 dbname    //启动了一个 SQLite 数据库会话,并打开名为 dbname 的数据库文件。如果 dbname 文件不存在,SQLite 将会创建一个新的数据库文件。
>.mode insert    //设置了输出模式为 insert,这意味着在执行 .dump 命令时,将以 SQL 插入语句的形式导出数据库中的数据。
>.output dbdump.sql   //设置了输出文件为 dbdump.sql,也就是说,.dump 命令导出的 SQL 语句将会保存到 dbdump.sql 文件中。
>.dump          //用于导出整个数据库的结构和数据。由于之前设置了输出模式为 insert,并指定了输出文件,因此数据库的内容将以 SQL 插入语句的形式保存到 dbdump.sql 文件中。
>.exit          //退出 SQLite 数据库会话,关闭数据库连接

使用时将【dbname】换成受损数据库的名字;【dbsump.sql】是输出的SQL语句文件

运行后,可以发现同级目录下出现了一个SQL语句文件,我的输出文件名为【test.sql】

打开【test.sql】看下里面的语句,主要是创建表、插入数据等

4)新建一个数据库

我就在刚才的目录下(受损数据库的目录)用命令行新建了一个【test.db】数据库

注意:要先用【sqlite3】目录进入sqlite3工具

 sqlite> .open test.db

运行后发现目录下多了一个文件

5)将第三步生成的SQL语句文件【test.sql】导入新的数据库,生成新的结构和数据

sqlite> .open test.db   //打开test.db数据库(此时为空,0kb)
sqlite> .read test.sql  //读取test.sql中的SQL语句信息,生成新的结构和数据
sqlite> .exit           //退出

6)改名

运行后,会发现数据库【test.db】从0kb变大了,具体大小与你原本的受损数据库有关,然后将【test.db】改名为你原本的数据库名字(我的数据库叫【POCT_CUSTOM.db】)即可替换使用

替换原本数据库后,发现界面的数据就能读出来了,顺利解决

PS.在此特别鸣谢潘工~

--END--

  • 26
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
数据库磁盘映像格式错误通常发生在数据库文件损坏或意外中断导致文件结构损坏时。为了修复这个问题,可以尝试使用以下数据库修复工具。 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数据库的特定工具,可以帮助修复损坏数据库文件。鉴于数据库的复杂性和不确定性,可能并不是所有情况下都可以成功修复,因此建议在操作前备份损坏数据库文件,以防万一。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wyn_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值