Sqlite 数据库中的 .db-shm 和 .db-wal 扩展名是啥?

Posted

技术标签:

【中文标题】Sqlite 数据库中的 .db-shm 和 .db-wal 扩展名是啥?【英文标题】:What are the .db-shm and .db-wal extensions in Sqlite databases?Sqlite 数据库中的 .db-shm 和 .db-wal 扩展名是什么? 【发布时间】:2011-12-08 09:18:15 【问题描述】:

在运行一些关闭数据库、删除数据库并用测试夹具替换它的测试后,我的应用程序及其数据库文件的状态出现了一些奇怪的行为。当我在调试 PC 上使用工具检查数据库文件时,它与应用程序本身报告的内容不匹配。这种奇怪的行为可能与this bug有关。

我注意到有两个文件与数据库具有相同的基本名称(具有正常的.db 扩展名。)文件扩展名是.db-shm.db-wal,每个文件都比.db 文件的新时间戳

我假设这些是某种类型的临时文件。但是,我想知道如果应用程序被终止,它们不应该被删除吗?更重要的是,我假设在应用程序被操作系统终止之前,存储在其中的任何数据都会在 .db 文件中更新。这是正确的吗?

【问题讨论】:

@satur9nine 真的很奇怪.. 我被要求更新别人的代码.. 在测试期间我意识到他对核心数据的使用在 ios 6.x 上工作得很好.. 但是当我在 iOS 7.x 上对其进行了测试。它导致上述.db-shm.db-wal.. 这发生在其他人身上吗? 在 iOS 7 上,这些似乎包含所有事务。 db 文件对我来说是一个空数据库。我需要抓取所有三个文件才能查看数据库的“真实”内容。 【参考方案1】:

你是对的,这些是 SQLite 创建的临时文件。如果您手动删除主数据库,您可能也应该删除这些。据我所知,WAL 是回滚日志的替代品,它使 SQLite 能够在事务失败时回滚更改。 SQLite 如何使用它们以及为什么它们存在这么长时间取决于 SQLite 的作者,但总的来说 SQLite 看起来非常坚如磐石,所以我不会太担心它们。欲了解更多信息,请查看此处:

http://www.sqlite.org/fileformat2.html#walindexformat

这些文件是 SQLite 3.7 的新特性。我不确定它们的存在是否与您指出的错误有关,但错误报告仍然建议解决方法。

更新:

关于 WAL 的更好的文档在这里:

https://www.sqlite.org/wal.html

WAL 的内容会定期移动到 DB 文件中,但不能保证每次进程退出时都会发生这种情况。因此,当启用 WAL 时,每个 SQLite DB 都包含磁盘上必须保留的两个文件,即 .db 文件和 .db-wal 文件。

.db-shm 文件是一个仅包含临时数据的共享内存文件。

【讨论】:

但是 .shm 文件呢。你能解释一下吗? 根据链接:mmapped文件与数据库位于同一目录,与数据库同名,后缀“-shm”。 我仍然不明白他们在做什么究竟,但似乎没有他们我无法查看 .db 文件的内容。它们是元数据吗? android 上,我想警告说,如果您将数据库移动到不同的文件夹,您还必须移动 -wal 和 -shm 文件。否则你的数据库可能是空的。这个问题至少出现在模拟器上。【参考方案2】:

我还没有足够的声誉来为 satur9nine 的答案添加评论,所以我会在这里堆积。

根据the SQLite docs,DB-SHM 文件是一个共享内存文件,仅在 SQLite 以 WAL(预写日志)模式运行时存在。这是因为在 WAL 模式下,共享同一个 db 文件的 db 连接必须全部更新用作 WAL 文件索引的相同内存位置,以防止冲突。

至于 WAL 文件,如上所述,它是一个写日志/日志,用于提交/回滚目的。如果数据库没有运行,删除这个文件是完全可以的,事实上如果存在的话,它会在重新启动数据库时自动删除(因为它只在数据库主动写入/提交数据时有用)。

【讨论】:

来自documentation(第 4 节):“WAL 文件是数据库持久状态的一部分,如果数据库被复制或移动,则应与数据库一起保存”。手动删除此文件可能会导致数据丢失!【参考方案3】:

确保您已正确关闭光标进入SELECT 操作。有时 SQLiteOpenHelper 由于未关闭的 Cursor 会创建 .db-shm.db-wal 扩展数据库。

【讨论】:

以上是关于Sqlite 数据库中的 .db-shm 和 .db-wal 扩展名是啥?的主要内容,如果未能解决你的问题,请参考以下文章

android如何将SQLite 3.7 WAL文件的内容合并到主数据库文件中?

SQLite 中的日期和时间

没有这样的表-世博会中的 SQLite 反应原生项目

从 sqlite 数据库中删除重复的行

Cocos2d-x中创建SQLite数据库

无法在 Sqlite3 Python Django 中的数据库中插入特定数据