SQLite3的数据库文件在突然断电或操作系统崩溃时会损坏吗?

Posted

技术标签:

【中文标题】SQLite3的数据库文件在突然断电或操作系统崩溃时会损坏吗?【英文标题】:Will database file of SQLite3 be damaged when suddenly power-off or OS crash? 【发布时间】:2010-11-29 23:33:57 【问题描述】:

我使用 sqlite3 的 open() 方法打开数据库文件并获得数据库连接,直到程序退出连接才会关闭。如果出现计算机突然断电或操作系统崩溃等意外错误,是否会损坏数据库文件的模式,或丢失其句柄?更具体地说,如果我重新启动计算机,它可以保持可写状态吗?顺便说一句,我不在乎发生错误时的数据丢失。

非常感谢!

【问题讨论】:

【参考方案1】:

SQLite 专门 旨在防止这种情况发生。来自官方SQLite is Transactional页面:

在一个单一的所有变化 SQLite 中的事务要么发生 完全或根本没有,即使 将更改写入 磁盘被中断

程序崩溃, 操作系统崩溃,或 电源故障。

上一段的主张是 在 SQLite 中进行了广泛检查 使用特殊的回归测试套件 模拟的测试工具 对数据库文件的影响 操作系统崩溃和电源 失败。

如果您需要了解 SQLite 如何防止上述崩溃的具体细节,您可能还对 SQLite 文章 Atomic Commit in SQLite 感兴趣。


关于崩溃后的写作:(来自File Locking and Concurrency

当进程处于数据库更新过程中并且程序或操作系统崩溃或电源故障阻止更新完成时,会创建热日志。热门期刊是一种例外情况。热日志的存在是为了从崩溃和电源故障中恢复。如果一切正常(也就是说,如果没有崩溃或电源故障),您将永远不会得到热门期刊。

可能发生的最糟糕的情况是您需要删除崩溃后留下的热门日志。

【讨论】:

谢谢!我还想知道如果在将一些更改写入数据库时​​发生电源故障,数据库文件(*.db)是否仍可写。 @quantity 锁定是在操作系统级别完成的,因此在突然失败并重新启动后,fschk 代码应该清除它并且文件将再次可以访问。锁定不是通过更改文件属性来完成的。此外,从答案中的文章参考资料来看,很明显“热门期刊”在访问数据库文件时会自动处理。 您永远不应该删除热日志文件。请参阅官方文档:How To Corrupt An SQLite Database File,第 1.3 节。【参考方案2】:

由于 Sqlite 符合 ACID,因此关机应该不是问题。

http://en.wikipedia.org/wiki/ACID

【讨论】:

我怕断电会影响文件的属性,根本打不开,或者我不能写任何数据。 @quantity,你为什么害怕这个?只要不删除日志文件,sqlite3应该可以在突然断电的情况下修复数据库。【参考方案3】:

突然断电可能会发生任何事情。不过,我建议 UPS 降低任何风险。

【讨论】:

由于宇宙射线,任何事情都可能发生,但实际上,在可预测的文件系统突然断电的情况下,sqlite3 数据库通常会保持一致。

以上是关于SQLite3的数据库文件在突然断电或操作系统崩溃时会损坏吗?的主要内容,如果未能解决你的问题,请参考以下文章

存储数据恢复服务器存储由于多次断电导致raid5阵列崩溃的数据恢复案例

在经常突然断电的情况下,使用 ext4 和 xfs 哪个文件系统更安全

VMWare虚拟机提示:“锁定文件失败,打不开磁盘或快照所依赖的磁盘”的解决方法

在经常突然断电的情况下,使用 ext4 和 xfs 哪个文件系统更安全

电脑突然断电,服务器链接不上怎么办

服务器数据恢复案例服务器崩溃重启无法进入系统故障的数据恢复