`
cwqcwk1
  • 浏览: 87278 次
文章分类
社区版块
存档分类
最新评论

讨论SQLite数据库损坏与修复

 
阅读更多
昨晚,朋友和我反馈SQLite数据库发生损坏有没有办法恢复。大致的情况是这样的,当数据库在使用时不小心用了新的文件覆盖数据库,导致了SQLite数据库出现了损坏,打开的时候出现要输入密码,而且不能把SQL语句dump下来。所以,文章这里整理SQLite数据库出现损坏的所有情况,以及如何修复损坏的SQLite数据库文件。

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.db
win下:
d:\>sqlite3mydata.db .dump >mydata.sql
d:\>sqlite3new.db <mydata.sql
d:\>sqlite3 aa.db "pragma integrity_check"

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

SQLite使用建议

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

参考:http://blog.csdn.net/mycwq/article/details/45541409
分享到:
评论

相关推荐

    Sqlite数据库修复工具RepairUR

    "Sqlite数据库修复工具RepairUR"是针对Sqlite数据库在使用过程中遇到问题,尤其是“database disk image is malformed”错误而设计的专业工具。 “database disk image is malformed”错误通常意味着数据库文件的...

    SQlite数据库修复工具(C#开发工程,含sqlite安装包)

    sqlite当多线程操作时,会有一定概率损坏;此工具可以修复数据库,把有问题的记录自动修复或移除。用Visual Studio2019开发,内含sqlite3安装包,可以直接查看代码,也可以直接使用编译好的文件测试。

    sqlite修复工具

    SQLite是一款开源、轻量级的数据库管理系统,广泛应用于...总的来说,SQLite修复工具是应对SQLite数据库损坏情况的有效解决方案。通过理解其工作原理和使用方法,可以更好地应对数据恢复挑战,保护珍贵的信息资源。

    C#代码创建sqlite数据库和表缺点,数据库容易坏

    本文将深入探讨如何使用C#代码来创建SQLite数据库和表,以及这种方法可能存在的缺点,尤其是数据库易损坏的问题。 首先,创建SQLite数据库和表的C#代码通常会涉及到以下关键步骤: 1. 引用SQLite相关的库:在C#...

    Sqlite3修复小工具

    修复完毕的数据库文件可能会比原数据库文件小,因为重建时收缩所知! 因为使用Sqlite3.exe 自带的命令行方式,可能有不能修复的情况 如果不能修改的话,当出现【修复完毕】(界面模式)的对话框时不要点确定,打开...

    Sqlite 数据库文件更新机制

    本篇文章将深入探讨Sqlite数据库文件的更新机制,包括其初始化过程、数据修改与保存策略,以及如何确保数据的一致性和安全性。 首先,Sqlite数据库的初始化通常涉及到创建一个新的数据库文件或打开已有的文件。当...

    svn修复 sqlite3

    至于提供的`sqlite3.exe`文件,它是SQLite3的命令行实用程序,可以用于直接与SQLite数据库进行交互。在修复SVN问题时,开发者或系统管理员可能会使用这个工具直接操作`wc.db`数据库,进行查询、修复或数据恢复。 总...

    数据库修复sqlite3 和 svn清理方法

    本篇文章将详细介绍如何解决“Failed to run the WC DB work queue associated with svn checkout”的错误,并介绍SQLite3数据库的修复方法。 首先,让我们关注SQLite3的问题。SQLite3数据库在遇到问题时,可能表现...

    sqlite3.exe

    然而,如果在清理过程中遇到数据库错误,如SQLite数据库损坏,`cleanup`操作就可能失败。SQLite是一个轻量级的关系型数据库,被许多应用程序用作本地存储,包括SVN的工作副本。 在这样的情况下,我们可以使用`...

    SQLite.Interop.dll

    SQLite.Interop.dll是SQLite数据库引擎在.NET环境中运行时的一个重要组件,它是SQLite与.NET Framework交互的桥梁。SQLite是一个轻量级的、开源的SQL数据库引擎,它可以在多种操作系统和编程语言中使用,包括C#、VB...

    SQLite 命令行工具

    在这个场景中,我们讨论的是如何在遇到SQLite数据库损坏时,利用命令行工具进行修复。 当SQLite数据库损坏导致无法正常打开时,可能的原因有多种,比如文件系统错误、不正确的关闭计算机、软件崩溃等。为了解决这些...

    Sqlite3 數據庫修復工具

    总结来说,"SQLite3数据库修复工具"是一个用于处理SQLite3数据库损坏问题的实用工具,通过深入解析数据库结构并采取适当的修复策略,帮助用户恢复丢失的数据。为了最大化恢复成功率,了解SQLite3的内部工作原理和...

    sqlite-tools-win32-x86-3310100.zip

    在“clean up失败”的场景下,可能是指在Subversion工作副本中清理(Cleanup)操作遇到了问题,这可能是由于SQLite数据库文件损坏或者锁定了。在这种情况下,`sqlite-tools-win32-x86-3310100.zip`中的工具可能被...

    mac下的sqlite查看工具

    对于数据库的维护,SQLiteManager可能包含工具来进行数据库优化、修复损坏的数据库文件,甚至进行安全备份和恢复。 此外,SQLiteManager可能还具有版本控制功能,允许用户追踪数据库的修改历史,这对于多人协作和...

    sqlite3.zip

    它的名称"sqlite3.exe"指的是Windows操作系统中的可执行文件,这个程序提供了对SQLite3数据库的命令行接口,允许用户交互式地创建、查询和管理SQLite数据库。 SQLite3数据库引擎以其高效性、可靠性和灵活性而受到...

    svn清理sqlite3

    3. **数据库修复**:如果数据库文件损坏,可以使用`sqlite3`命令行工具尝试修复。打开命令行,输入`sqlite3 wc.db .rebuild`,这会重建数据库结构。但请注意,这可能会导致部分数据丢失,因此在尝试前最好先备份。 ...

    SQLite_Expert_Professional_3.5.78_XiaZaiBa

    虽然这与SQLite数据库本身并无直接关系,但若SVN存储库中包含SQLite数据库文件,使用SQLite Expert Professional可以更方便地检查和修复可能因版本控制问题导致的数据库损坏。 SQLite Expert Professional 3.5.78 ...

    sqlite用于解决svn无法cleanup等问题

    4. **SQLite实用工具**:有许多第三方工具,如SQLite Browser、DB Browser for SQLite等,它们提供了图形化的界面,帮助用户查看和修复SQLite数据库。 5. **恢复到备份**:如果以上方法都无效,可能需要回滚到最近的...

    Mac下SQLite-Analyzer编辑器

    6. 错误检查与修复:提供数据库健康检查功能,检测并修复潜在的数据库错误,如损坏的页、非法数据等。 7. 图形化界面:SQLite-Analyzer通常具有直观的图形用户界面,使得非技术背景的用户也能轻松上手。 8. 教程与...

    sqlite3.rar

    4. **修复SVN问题**:在某些情况下,SVN的错误可能与项目中的SQLite数据库文件有关。通过sqlite3.exe,用户可以尝试修复损坏的数据库,或者导出数据以备份和恢复。 5. **命令行语法**:熟悉sqlite3.exe的命令行语法...

Global site tag (gtag.js) - Google Analytics