数据库损坏的可能原因
1. 数据库文件被其他线程覆盖或删除
- 在文件描述符关掉以后,继续使用这个文件描述符访问
- 打开文件,获取文件描述符fd(其实是一个整形)
- 关闭文件
- 打开sqlite文件,获取文件描述符(碰巧也是)fd
- 另一个线程继续使用fd,写文件
- sqlite文件被损坏
- 在事务进行过程中,进行数据库备份或恢复
在数据库事务过程中,数据库文件既包括老的内容,也包括新的内容。如果此时拷贝这个文件,数据库可能会被损坏。 备份数据库最好使用sqlite的api。 - 删除日志文件
日志文件中包括rollback需要的信息。删除以后,无法正确回滚,有可能会导致数据库损坏。
2. 文件锁相关
sqlite使用文件锁来在保证多线程访问。如果文件锁机制不正常,会导致同时读写文件等信息,导致数据库损坏
- 文件系统没有正确的实现文件锁的机制
在网络操作系统中,比较常见 - 不正确使用close()函数
在Unix中,close()函数会解除所有线程的文件锁。
例如A、B线程打开了数据库文件,使用sqlite的api。此时,线程C依次调用了open()
,read()
以及close()
。此时,这个文件的所有锁已经没了。因此A、B有可能会同时写数据到文件中。 - 两个进程使用不同的锁协议(locking protocols)
默认使用POSIX advisory locking
,可以用sqlite3_open_v2()
函数修改。如果不一致,可能发生同时读写,数据库损坏。 - 在数据库文件使用时rename或unlink
两个进程A、B,同时对一个数据库文件建立数据库连接。A关闭连接,unlink文件,用同样的名字创建一个新的数据库文件,在打开这个数据库。这样子A、B两个进程在使用不同的数据库,名字却是一样的。 然而,日志文件是根据数据库名字来区分数据库文件的。因此这两个进程的数据库文件会是同一个。导致数据库文件损坏。 - 一个文件有多个连接
也就是说一个数据库文件有多个名字。假如A、B使用不同的名字打开同一个数据库链接,会有两个日志文件。 如果线程A crash了,B检测到需要进行rollback。找不到日志文件,无法回滚。
3. sync失败
为了保证数据库文件的一致性(consistent),会调用fsync()
系统调用,把内存中的数据刷到磁盘中。如果这个sync操作失败,会导致数据库文件损坏
- sync系统调用和文档描述不一致
USB闪存经常这样子。例如写大数据时,在函数返回已写入成功时,USB的指示灯还在亮着。 - 使用PRAGMAs禁用sync
synchronous=OFF
可以提高速度,却会导致文件不一致。
4. 硬盘、闪存损坏
5. 内存损坏
当野指针、内存溢出等原因,可能导致内存中的数据库结构损坏,从而有可能导致数据库文件损坏。
当进行memory-mapped I/O时,由于内存直接映射到磁盘,如果发生数组越界等,内存中的数据损坏,磁盘文件也会损坏
6. 其他操作系统问题
- 文件系统崩溃 ##7.sqlite的bug
转载于:https://www.cnblogs.com/huahuahu/p/shu-ju-ku-sun-huai-de-ke-neng-yuan-yin.html
数据库损坏的可能原因相关推荐
- 服务器损坏是什么意思微信,微信数据库损坏是什么原因?
微信数据库损坏,这是由于你的操作系统和该版本的微信不兼容或者你的微信软件有损坏. 微信系统自带修复并不能百分百成功,原因是每个人手机内存大小不同,微信使用的数据量多少不同,所以在修复的过程中缓存区如果 ...
- 【问】数据库损坏的原因有哪些?
数据库损坏常见的原因有以下几种: 1. 事务日志问题.比如事务日志文件丢失:事务日志文件在操作过程中被误删:事务日志文件被损坏以及事务日志文件过大,导致硬盘的空间不足等: 2. 意外掉电或异常强制 ...
- Andriod SQLite3 数据库损坏,优化,修复,备份方案研究
Andriod Sqlite3 数据库损坏,修复,备份方案研究 1.数据库损坏原因 我们首先来看 SQLite 损坏的原因,SQLite官网<How To Corrupt An SQLite D ...
- mysql连接外部数据库名字错误_数据库连接出错! 可能出错原因:数据库位置或名称不对、数据库损坏!...
Response.Buffer=True Response.ExpiresAbsolute=Now()-1 Response.Expires=0 Response.CacheControl = &qu ...
- SQL数据库损坏,报错,原因及注意事项
同岳科技最近一段时间接到很多客户咨询SQL数据库损坏,附加数据库报错的一些问题,在这里整理一下SQLSEVER数据库常见的一些故障现象及注意事项. 目前中小型企业使用SQLSEVER应用的非常多,但由 ...
- SQLSERVER数据库经常置疑的原因
SQLSERVER数据库经常置疑的原因 近段时间经常收到客户的求助电话,说他们的SQLSERVER业务数据库置疑了,因为系统不能使用,所以他们也不能加油正常营业 (我们是做加油站IC卡管理系统的)因为 ...
- SQL Server数据库损坏、检测以及简单的修复办法
简介 在一个理想的世界中,不会存在任何数据库的损坏,就像我们不会将一些严重意外情况列入我们生活中的日常一样,而一旦这类事情发生,一定会对我们的生活造成非常显著的影响,在SQL Server中也同样如此 ...
- SQLite数据库损坏与修复
[引子] 平时用sqlite数据库比较少.被问到sqlite数据库损坏怎么办这个问题时就把我难住了,于是就整合了几篇比较好的文章,记录一下. SQLite算是非常稳定的数据库,不容易出现损坏,就算应用 ...
- SEPM嵌入式数据库损坏的一种修复方法及sem5.log的缩小方法
若要修复SEPM嵌入式数据库损坏,可参考下面的方法: 1. 运行嵌入式数据库进程 DBSRV9.EXE(program files\symantec\symantec endpoint protect ...
最新文章
- NYOJ 622 Vote
- Request method 'GET' not supported解决方式
- red linux安装mysql_RedHat下安装MySQL5.5
- 汽车之家店铺数据抓取 DotnetSpider实战[一]
- 单一索引和复合索引区别及联系
- el-table click事件多次触发_JavaScript从零开始——DOM事件编程(1)
- Jquery ThickBox的使用
- 软件测试用例编写方法
- Tinder活号技术在YouTube上面居然有用模拟器和浏览器玩明白了使用谷歌下载的
- ELK日志系统设计方案-Log4j日志直推Kafka
- matlab 混沌_释放混沌猴子
- 一行Python代码让图形秒变「手绘风」
- python中imag是什么意思_Python-在imag中查找主要/最常见的颜色
- Android屏幕渲染
- 论文阅读-2022.1.2-A Neural Network Approach for_2016_一种用于知识驱动响应生成的神经网络方法
- vue写一个翻页的时间插件
- 上海2021年高考成绩排位查询,2021年上海高考分数一分一段位次表,上海高考个人成绩排名查询方法...
- 【ASE入门学习】ASE入门系列二十四——轴向溶解
- 零基础学软件测试基础篇---什么是软件测试
- 全文收索服务-solr介绍
热门文章
- [转]Unity3D 唤醒微信 打开微信(非微信登录、微信分享)
- Django中ORM中queryset方法详解
- Maven中optional和scope元素的使用,你弄明白了?
- PhotoView——支持图片缩放、平移、旋转的一个优雅的三方组件
- 解决jupyter不自动跳转到浏览器问题
- 神剑情天php,神剑情天角色人物介绍 - 我爱秘籍
- Java语言实现支持视频点播的WEB服务器
- 2019 年(D 题)简易电路特性测试仪 自用学习
- 为何中国没有亚伦 斯沃茨_史蒂夫·斯沃茨(Steve Swartz)让我们想起了靛蓝的意图...
- python—requests模块使用代理