SQLite数据库损坏与修复



导致SQLite数据库损坏的情况

导致SQLite数据库损坏的情况大致可归结为4类:文件覆盖问题、文件锁问题、数据同步问题、内存问题

文件覆盖问题

SQLite数据库文件被覆盖是可能的,毕竟是一个普通的磁盘文件,意味着所有的进程都可以打开和覆盖,所以不可能完全避免文件覆盖的情况。 1. 多线程写数据库问题。  SQLite数据库是支持多进程并发读写,但是如果这时候关闭和重新打开数据库,就很可能出现一些线程还在写数据到数据库,出现部分数据被覆盖的情况。
2. 执行事务时备份或恢复数据  事务都是一个过程性的操作,需要一定时间,而数据备份是原子操作,如果在事务执行过程时备份,可能导致复制的内容包含了部分新的内容和部分旧的内容,就出现数据库损坏。恢复也是一样。
3. 删除日志文件  SQLite数据库通常都是存储所有内容到一个文件,但执行事务时,为了实现程序崩溃,断电时可以回滚日志,就伴随着一些附加的日志文件。如果日志被删除了,就会导致恢复出现异常。

文件锁问题

为了实现SQLite数据库并发读写,SQLite会使用文件锁来保证数据安全。 1. 系统文件锁问题 SQLite依赖于底层的文件系统对文件锁的实现,但是,一些文件系统存在锁逻辑错误,使得锁并不可靠,这在网络文件系统和NFS情况比较常见。
2. POSIX协同锁(advisory lock) 在linux 或者unix下,SQLite 默认锁是协同锁。当进程使用协同锁,如果其中有一个线程执行 close() 就可能导致锁被取消。如果已经有两个线程同时连接到同一个数据库,再来一个线程不以SQLite API的形式,就是以系统文件形式读取数据库( open(), read() , 然后close()),就会导致这个进程的数据库锁被取消,而两个线程同时操作数据库就会导致数据覆盖引起错乱。
3. 不同的连接协议 不同的连接协议锁也可能会不同,也就导致锁没有发挥错误引起错误。
4.当数据库正在使用时删除或重命名数据库文件 出现这种情况往往是在linux等类POSIX系统,windows下不会出现这个情况,而且同时有事务执行就会放大这个问题。

数据同步问题

为了保证数据一致性,SQLite有时候会请求操作系统将所有等待持久化的数据刷入磁盘,然后等待这个操作完成。 1.磁盘驱动器的同步请求可能是不可靠的  现有普通消费级别的磁盘驱动器多数都会谎报数据同步结果,以期望得到更高的写入速度。当数据刚到达磁盘缓冲区,还没真正写入氧化物介质,磁盘驱动器就报告内容已经安全写入。但是这时候断电、硬件复位就会导致数据同步失败。这种情况主要出现在闪存介质。
2.使用PRAGMAs会影响同步 通过设置PRAGMA synchronous=OFF, SQLite所有的同步操作都会被忽略。这使得SQLite运行得更快,但如果出现电源故障或硬件复位就会前面保存的所有数据。如果单纯为了获得最大的数据可靠性和健壮性,SQLite可设置synchronous = FULL

内存问题

SQLite作为一个C运行库,和使用它的应用程序运行在同一个内存地址空间。这意味着,任何野指针,缓冲区溢出,堆损坏等都有可能损坏了SQLite的数据结构,并最终导致数据库文件损坏。另外,使用内存映射I/O模型(如mmap)的时候,内存问题会变得更加严重。当数据库文件的一部分或全部被映射到应用程序的地址空间,虽然减少了文件IO操作,但是野指针可能访问并修改到任何部分的映射空间数据。
更多SQLite数据库损坏的原因可以看这里。

修复损坏的SQLite数据库

linux下:$ sqlite3 mydata.db ".dump" | sqlite3 new.dbwin下:d:\>sqlite3 mydata.db .dump > mydata.sqld:\>sqlite3 new.db < mydata.sqld:\>sqlite3 aa.db "pragma integrity_check"

这里可以下载 sqlite3.exe当然,这些API只是在一定程序修复损坏的数据库,无法解决所有的问题。

SQLite使用建议

这里有4点建议:1. 减少多进程或多线程操作,尽可能单线程写。2. 减少事务操作,减小事务复杂度,减少检查点3. 减少数据库的大小4. 避免使用PRAGMA synchronous=OFF

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

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

相关文章

如何定位Source Generators性能问题

前言在以前的文章中&#xff0c;我们介绍过如何调试Source Generators。但是当实现较为复杂时&#xff0c;我们需要能够快速地分析Source Generators性能的方法。默认情况下&#xff0c;使用VS 2019自带的“性能探查器”不能分析Source Generators项目&#xff0c;因为它是类库…

什么是域(domain)

在今天很多人都有意识或无意识的跟域这个东西打过交道。如果你在公司里使用电脑&#xff0c;并且你的电脑接入了公司的局域网&#xff0c;那你的电脑很可能就在一个域中。如何查看你的电脑是否连接到一个域中&#xff0c;以Windows为例&#xff0c;右击我的电脑 –>属性&…

四舍五入运算

为什么80%的码农都做不了架构师&#xff1f;>>> 请用户输入1个实数(浮点型),请编写算法对这个实数进行四舍五入到个位的运算. 例如 12.56经过四舍五入运算得到13. 而12.45经过四舍五入运算得到12 代码如下地址: http://git.oschina.net/touch1D/qf17j3eughwdp8zxi…

python 新建html_Python学习第226课——html中创建按钮

前面我们学习了一些常见的表单元素&#xff0c;表单就是用来收集用户的信息的&#xff0c;比如调查问卷、用户登录网站的页面等这类的网页&#xff0c;里面都要用到表单元素&#xff0c;当用户在前端页面上填入账号、密码、或者调查问卷的答案等等信息之后&#xff0c;就需要提…

Linux之软连接和硬链接

&#xfeff;&#xfeff;1.Linux链接概念 Linux链接分两种&#xff0c;一种被称为硬链接&#xff08;Hard Link&#xff09;&#xff0c;另一种被称为符号链接&#xff08;Symbolic Link&#xff09;。默认情况下&#xff0c;ln命令产生硬链接。 【硬连接】 硬连接指通过索引…

WPF 实现图片切成九宫格控件~

WPF开发者QQ群&#xff1a; 340500857由于微信群人数太多入群请添加小编微信号yanjinhuawechat 或 W_Feng_aiQ 邀请入群需备注WPF开发者 PS&#xff1a;有更好的方式欢迎推荐。接着上一篇倒计时控件01—代码如下一、创建 CropControl.cs代码如下。&#xff08;修改RowColumn “…

使用Visio进行UML建模

资料地址&#xff1a;使用Visio进行UML建模-http://www.qdgw.edu.cn/zhuantiweb/jpkc/2009/rjkf/xmwd/Visio_UmlModel.htm转载于:https://www.cnblogs.com/svennee/p/4075700.html

GCT之数学公式(三角函数)

转载于:https://www.cnblogs.com/jyh317/p/3386598.html

C++基础知识总结(一)

C程序以.cpp作为文件扩展名。 C标准输入输出库的头文件是iostream&#xff0c;在程序中使用&#xff1a;#include <iostream>//包含头文件 C使用命名空间&#xff1a;using namespace std; 对象的定义及初始化&#xff1a;int z(0)//等价int z0&#xff1b; 用关键字cons…

Android安全与逆向之Java虚拟机和Dalvik虚拟机的区别

Google于2007年底正式发布了Android SDK, 作为 Android系统的重要特性&#xff0c;Dalvik虚拟机也第一次进入了人们的视野。它对内存的高效使用&#xff0c;和在低速CPU上表现出的高性能&#xff0c;确实令人刮目相看。 依赖于底层Posix兼容的操作系统&#xff0c;它可以简单的…

软件与硬件我该选哪个_MacBook Air 和 MacBook Pro 该选哪个……?

一个多月前&#xff0c;Apple 发布了 2019 款 MacBook Air 和 MacBook Pro&#xff0c;经过这一次的更新之后&#xff0c;MacBook 产品线总算变得更加清晰了&#xff0c;同时也减少了之前存在的价格和定位产生冲突的现象。不过从购买决策来看&#xff0c;我发现还是有些问题难倒…

只要300页!火遍全网的NET6+linux知识手册!拿走不谢!

这是微软公司基于最新的.net 6编写&#xff0c;循序渐进地对.net6/C#10进行讲解。对于零基础可以作为.net的快速入门教材&#xff0c;对于高级程序员而言&#xff0c;这也是你的进阶之路&#xff01;NO.1资料介绍该手册,全面的介绍.net6和c#的新特性&#xff0c;看完这个资料&a…

Linux0.11内核剖析--内核体系结构

一个完整可用的操作系统主要由 4 部分组成&#xff1a;硬件、操作系统内核、操作系统服务和用户应用程序&#xff0c;如下图所示&#xff1a; 用户应用程序是指那些字处理程序、 Internet 浏览器程序或用户自行编制的各种应用程序&#xff1b; 操作系统服务程序是指那些向用户所…

centos 6安装报错

Missing ISO 9660 imageThe installer has tried to mount image # 1. but cannot find it on the hard drive.Please copy this image to the drive and click Retry. Click Exit to abort the installation. 这个是安装过程中你没有把iso镜像拷贝到你的U盘所导致&#xff01;…

ubuntu上最使用jni最简单易懂的例子

第一步:爆结果照,让你有坚持下去的信心 二、NDK解释 NDK全称:Native Development Kit。 NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。 NDK集成了交叉编译器,并提供了相应的m…

buck变换器设计matlab_一种用于Boost PFC变换器的改进关断时间控制策略

随着我国工业的发展&#xff0c;越来越多的非线性负荷接入电网&#xff0c;各种换流设备的使用&#xff0c;使电网的电压波形发生畸变&#xff0c;造成电能质量下降&#xff0c;威胁电网和各种用电设备的安全、经济运行。为了能够确保电网安全&#xff0c;研制出了各种PFC变换器…

你初吻啥时候没有的​?​

1 &#xff1f;&#xff1f;&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 世界上最难受的三件事&#xff08;via.惨绿少年金三坨&#xff0c;侵删&#xff09;▼3 漏网之鱼▼4 有哪里不太对劲&#xff1f;&#xff08;素材来源网络&#xff0c;侵删…

乡亲们,我们创建了 Dapr 中文交流频道

我们创建了 Dapr 中文交流 QQ 频道&#xff0c;欢迎大家加入&#xff01;加入方式在文章最后一节。为什么要创建频道&#xff1f; 解决什么问题**专业性&#xff0c;“你可以在我们群里面钓鱼&#xff0c;因为都是水”** 你肯定加过非常多的这种叫什么技术交流群。你会发现这个…