【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--

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/518607.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++】C/C++内存管理详解

个人主页 : zxctscl 文章封面来自:艺术家–贤海林 如有转载请先通知 目录 1. 前言2. C/C内存分布3. C语言中动态内存管理方式4. C中动态内存管理4.1 new/delete操作内置类型4.2 new和delete操作自定义类型 5. operator new与operator delete函数5.1 oper…

GO泛型相关

通过引入 类型形参 和 类型实参 这两个概念,我们让一个函数获得了处理多种不同类型数据的能力,这种编程方式被称为 泛型编程。 2. Go的泛型 类型形参 (Type parameter)类型实参(Type argument)类型形参列表( Type parameter list)类型约束(Type constr…

加密 / MD5算法 /盐值

目录 加密的介绍 MD5算法 盐值 加密的介绍 加密介绍:在MySQL数据库中, 我们常常需要对密码, 身份证号, 手机号等敏感信息进行加密, 以保证数据的安全性。 如果使用明文存储, 当黑客入侵了数据库时, 就可以轻松获取到用户的相关信息, 从而对用户或者企业造成信息…

Uboot的start.s源码分析

/* * armboot - Startup Code for ARM920 CPU-core * * Copyright (c) 2001 Marius Gr鰃er <magsysgo.de> * Copyright (c) 2002 Alex Z黳ke <azusysgo.de> * Copyright (c) 2002 Gary Jennejohn <gjdenx.de> * * See file CREDITS for list of people w…

SoundTouch对音频处理(Android)

SoundTouch对音频处理&#xff08;Android&#xff09; SoundTouch介绍 SoundTouch 是一个用于音频处理的开源库&#xff0c;主要用于改变音频的速度、音调和音量等特征。您可以在项目中使用 SoundTouch 库来实现音频处理的功能&#xff0c;比如变速播放、音高变化、混响效果…

STM32CubeIDE基础学习-STM32CubeIDE软件快捷键介绍

STM32CubeIDE基础学习-STM32CubeIDE软件快捷键介绍 文章目录 STM32CubeIDE基础学习-STM32CubeIDE软件快捷键介绍前言第1章 查看快捷键方法第2章 设置快捷键方法第3章 常用快捷键示例总结 前言 这个STM32CubeIDE软件使用的是Eclipse框架的开发环境&#xff0c;所以所使用的快捷…

Spring Boot 3核心技术与最佳实践

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 highlight: a11y-dark 引言 Spring Boot作为…

自学新标日第七课(未完结)

第七课 单词 单词假名声调词义コーヒーコーひー&#xff13;咖啡コーラーコーラー&#xff11;可乐お茶おちゃ&#xff10;茶ワインわいん&#xff11;葡萄酒パンぱん&#xff11;面包ケーキけーき&#xff11;蛋糕お粥おかゆ&#xff10;粥昼ごはんひるごはん&#xff13;午…

离散数学——(1)数理逻辑,命题的概念,命题联结词,条件联结词,命题公式,命题的翻译

目录 1.数理逻辑 2.命题的概念 1.命题的判断 ​2.命题的真值 ​ 3.原子命题和复合命题 3.命题联结词 1.否定联结词 2.合取联结词 3.析取联结词 4.条件联结词 ​1.双条件联结词 5.命题公式 1.合式公式 6.命题的翻译 1.数理逻辑 2.命题的概念 1.命题的判断 2.命…

泽众云真机-为什么老机型专区大部分是维护中?如何解决

最近&#xff0c;泽众云真机平台有几位用户向我们咨询&#xff0c;为什么老机型专区大部分是维护中&#xff1f;我想使用这些机型怎么办&#xff1f; 首先来解释一下&#xff0c;为什么叫“老机型专区”&#xff1f;因为一些老的机型之前一直是在线状态&#xff0c;通过我们长期…

springboot245科研项目验收管理系统

科研项目验收管理系统 摘 要 使用旧方法对科研项目信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在科研项目信息的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。这次…

nginx代理minio客户端

错误方式 在点击桶名查看文件时, 会一直处于loading加载中 worker_processes 1; #设置 Nginx 启动的工作进程数为 1。events {worker_connections 1024; ##设置每个工作进程的最大并发连接数为 1024。 }http {include mime.types; #该文件定义了文件扩展名和 MIME 类型…