揭秘 SQLite 数据库文件:.sqlite、-wal 与 -shm 的核心关系
内容
在开发或运维应用(例如 `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` 文件通常会自动消失或被重用。
**核心总结**:这三个文件在运行期间共同构成了一个逻辑上的完整数据库。在数据库运行或未正常关闭时,**绝对不要手动删除或移动**其中的任何一个文件。
关联内容
MySQL分区终极指南:从创建、自动化到避坑,一文搞定!
时长: 00:00 | DP | 2025-12-01 08:00:00百万级PV日志表优化实战:从VARCHAR到TINYINT的华丽转身
时长: 00:00 | DP | 2025-12-30 23:18:20揭秘隐藏成本:MySQL InnoDB索引到底占用多少存储空间?
时长: 00:00 | DP | 2026-02-01 08:38:42MySQL整数类型揭秘:SMALLINT与MEDIUMINT的范围与最佳实践
时长: 00:00 | DP | 2026-03-03 19:25:01相关推荐
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(),...