SQLite DB中的-shm和-wal文件

时间:2012-10-17 06:20:15

标签: c sqlite unix sqlite-journal-mode

运行wal_checkpoint(FULL)后,我正在使用cp命令备份SQLite DB。 DB正在WAL模式下使用,因此我的文件夹中还有其他文件,如-shm和-wal。 当我运行wal_checkpoint(FULL)时,WAL文件中的更改将提交到数据库。我想知道运行检查点后-wal和-shm文件是否被删除了。如果没有,那么它们包含什么?

我知道我的备份过程不好,因为我没有使用SQLite备份API。这是我的代码中的一个错误。

任何人都可以建议运行检查点后-shm和-wal文件包含哪些内容。

提供的任何链接都会有所帮助。

由于

2 个答案:

答案 0 :(得分:17)

在搜索了大量资料后,我认为以下情况属实:

  1. -shm文件包含-wal文件的索引。 -shm文件在读取-wal文件时提高了性能。
  2. 如果-shm文件被删除,则会在下次访问数据库时再次创建该文件。
  3. 如果运行checkpoint,则可以删除-wal文件。
  4. 执行安全备份:

    1. 建议您使用SQLite备份功能进行备份。 SQLite库甚至可以备份在线数据库。
    2. 如果您不想使用(1),那么最好的方法是关闭数据库句柄。这可确保数据库文件的清晰且一致的状态,并删除-shm-wal文件。然后可以使用cpscp
    3. 进行备份
    4. 如果要通过网络传输SQLite数据库文件,则应在checkpoint之后运行 vacuum 命令。这样可以消除数据库文件中的碎片,从而减小其大小,从而通过网络传输更少的数据。

答案 1 :(得分:5)

-shm文件不包含任何永久数据。

当最后一个连接关闭时,数据库会自动检查点,然后删除-wal文件。 这意味着在检查点之后,如果不存在其他连接,-wal文件不包含任何重要数据。

如果可能,您应该在备份之前关闭连接。