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

Jef*_*rod 55 sqlite file-extension android

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

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

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

sat*_*ine 29

你是对的,这些是SQLite创建的临时文件.如果您手动删除主数据库,您应该删除它们.从我可以收集的内容来看,WAL是对回滚日志的替代,它使SQLite能够在事务失败时回滚更改.SQLite如何使用它们以及为什么它们被保存了这么长时间取决于SQLite的作者,但一般来说SQLite看起来非常坚固,所以我不会太担心它们.有关详细信息,请查看此处:

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

这些文件是SQLite 3.7的新功能.我不确定它们的存在是否与你指出的错误相关,但错误报告建议无论如何都要解决.

  • 但是.shm文件怎么样?你能说点什么吗? (3认同)
  • 在 Android 上,我想警告,如果您将数据库移动到不同的文件夹,您还必须移动 -wal 和 -shm 文件。否则你的数据库可能是空的。这个问题至少出现在模拟器上。 (2认同)

小智 5

我还没有足够的声誉,只能在satur9nine的答案中添加评论,所以在此继续介绍。

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

对于WAL文件,如上所述,它是一个写日志/日志,对于提交/回滚目的很有用。如果数据库未在运行,则删除该文件是完全可以的,实际上,如果存在该文件,它将在重新启动数据库时自动删除(因为它仅在数据库正在主动写入/提交数据时才有用)。

  • 来自[文档](https://www.sqlite.org/wal.html)(第4节):“WAL文件是数据库持久状态的一部分,如果复制数据库,则应与数据库一起保存或移动”。手动删除该文件可能会导致数据丢失! (7认同)