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

打印 上一主题 下一主题

主题 503|帖子 503|积分 1509

目录

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语句的情势导出数据库中的数据和结构

具体命令及寄义如下:
  1. sqlite3 dbname    //启动了一个 SQLite 数据库会话,并打开名为 dbname 的数据库文件。如果 dbname 文件不存在,SQLite 将会创建一个新的数据库文件。
  2. >.mode insert    //设置了输出模式为 insert,这意味着在执行 .dump 命令时,将以 SQL 插入语句的形式导出数据库中的数据。
  3. >.output dbdump.sql   //设置了输出文件为 dbdump.sql,也就是说,.dump 命令导出的 SQL 语句将会保存到 dbdump.sql 文件中。
  4. >.dump          //用于导出整个数据库的结构和数据。由于之前设置了输出模式为 insert,并指定了输出文件,因此数据库的内容将以 SQL 插入语句的形式保存到 dbdump.sql 文件中。
  5. >.exit          //退出 SQLite 数据库会话,关闭数据库连接
复制代码
使用时将【dbname】换成受损数据库的名字;【dbsump.sql】是输出的SQL语句文件

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

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

4)新建一个数据库

我就在刚才的目录下(受损数据库的目录)用命令行新建了一个【test.db】数据库
注意:要先用【sqlite3】目录进入sqlite3工具
  1. sqlite> .open test.db
复制代码
运行后发现目录下多了一个文件




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

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

6)改名

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

更换原本数据库后,发现界面的数据就能读出来了,顺利解决
PS.在此特殊鸣谢潘工~

--END--

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

星球的眼睛

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表