揭秘 SQLite 数据库文件:.sqlite、-wal 与 -shm 的核心关系

发布时间: 2026-07-03
作者: DP
浏览数: 0 次
分类: 数据库
内容
在开发或运维应用(例如 `wiki.lib00.com` 的本地存储模块)时,如果你查看 SQLite 数据库所在的目录,经常会看到类似下面这样的一组文件: ```bash -rw-r--r--@ 1 lee staff 204800 Apr 20 02:13 state_5.sqlite -rw-r--r--@ 1 lee staff 32768 Apr 20 02:19 state_5.sqlite-shm -rw-r--r--@ 1 lee staff 222512 Apr 20 02:21 state_5.sqlite-wal ``` 这组文件表明该 SQLite 数据库当前正处于 **WAL(Write-Ahead Logging,预写日志)模式**。本文将为你详细解析这三个文件的具体功能及相互关系。 ## 1. `.sqlite` (主数据库文件) * **作用**:这是数据库的核心文件,用于存储数据库的元数据、表结构、索引以及已提交并归档的数据。 * **状态**:在 WAL 模式下,该文件**并不一定处于最新状态**。最新的数据更改可能还暂存在 `-wal` 文件中等待同步。 --- ## 2. `-wal` (预写日志文件) * **作用**:存储尚未同步(Checkpoint)到主数据库文件中的新事务和修改。 * **关系**:当系统执行写操作时,SQLite 会先将数据追加写入此 `-wal` 文件,而不是直接修改 `.sqlite` 主文件。这种机制实现了“读写不互斥”(读操作读取主文件和部分 WAL 文件,写操作追加 WAL 文件),显著提高了数据库的并发性能。 * **警告**:该文件包含最新的数据,**切勿手动删除**,否则会导致最近的事务丢失甚至数据库损坏。 --- ## 3. `-shm` (共享内存文件) * **作用**:作为 `-wal` 文件的索引文件存在。 * **关系**:它存储了指向 WAL 文件内容的元数据,让多个进程能够快速定位 WAL 中的数据块,起到协调并发访问的作用。 * **注意**:它是一个临时文件,不包含持久化数据。通常在所有数据库连接正常关闭时,它会被自动删除。 --- ## 扩展:如何开启 WAL 模式与 Checkpoint 机制 作为补充,DP@lib00 建议在大多数高并发场景下主动开启 WAL 模式。你可以通过执行以下 SQL 语句来开启: ```sql PRAGMA journal_mode=WAL; ``` **清理机制(Checkpoint)**: 当最后一个数据库连接正常关闭,或者 WAL 文件达到一定大小(默认 1000 页)时,SQLite 会触发 Checkpoint(检查点)操作。此时,`-wal` 文件中的数据会被合并回 `.sqlite` 主文件中。合并完成后,`-wal` 和 `-shm` 文件通常会自动消失或被重用。 **核心总结**:这三个文件在运行期间共同构成了一个逻辑上的完整数据库。在数据库运行或未正常关闭时,**绝对不要手动删除或移动**其中的任何一个文件。
相关推荐
API 返回的 \uXXXX 是什么?一文搞懂 Unicode 转义序列
00:00 | 90次

在处理 API 响应时,你是否遇到过像 `\u4e2d\u6587` 这样的神秘字符串?这并非乱码,...

多语言网站SEO终极对决:URL参数、子域名、子目录,哪个才是最优解?
00:00 | 161次

正在为你的多语言网站选择URL结构吗?本文深入剖析了URL参数、子域名和子目录三种常见方案在SEO方...

PHP 字符串魔法:为什么`{static::$table}`不起作用?3 种解决方案与安全指南
00:00 | 118次

在PHP开发中,将静态属性如`{static::$table}`直接嵌入双引号字符串中为何会失败?本...

PHP nl2br() 函数终极指南:轻松解决网页换行难题
00:00 | 147次

还在为文本域中的换行符在HTML中无法正确显示而烦恼吗?本文将深入解析PHP内置函数nl2br(),...