SQLite / LiteDB 单文件数据库为何“清空表后仍占几 GB”?——原理解析与空间回收实战

关键词: SQLite、LiteDB、VACUUM、WAL、auto_vacuum、文件瘦身、数据库维护

在嵌入式或桌面、IoT 网关等场景,很多同学都会选择单文件数据库(SQLite、LiteDB、SQL CE…)。
最近群里一位朋友反馈:

“我的 test.db 已经把业务数据全删光,但文件依旧 3.8 GB!
甚至重启程序也没变小,这是为啥?”

别急,这并不是磁盘“被占用不释放”,而是单文件数据库按页管理延迟回收的正常机制。本文将:

  • 揭秘删除数据后文件仍超大的五大原因
  • 手把手演示在 Linux / Windows 下 VACUUM / Rebuild 压缩操作
  • 给出线上环境自动瘦身写放大平衡的最佳实践

1 原理:删除 ≠ 收缩,空闲页仍在文件里

以 SQLite 为例:

  1. 固定页 (Page) 结构 – 默认 4 KiB。
  2. DELETE / DROP TABLE 时,记录被打上 unused flag,所在页被挂到 freelist
  3. 文件尾部不会立即截断,因此操作系统看到的文件大小不变。
  4. WAL 模式 下,.db-wal 日志同样采用追加写,旧数据也留在磁盘。
  5. 只有执行 VACUUM (或 auto_vacuum=FULL 时的新页写满)才会真正搬运存活数据 → 重写文件 → 释放未用 page。

LiteDB(.NET 生态)等其他单文件 DB 也采用相似策略,名字不同(如 Rebuild())而已。


2 五大常见原因对照表

#文件仍巨大的原因是否“异常”解决手段
1空闲页积累:大量删除后未 VACUUM⚠️ 正常VACUUM;
2WAL 日志残留.db-wal + .db-shm 未 checkpoint⚠️ 正常PRAGMA wal_checkpoint(TRUNCATE);VACUUM;
3预扩容:曾设置 max_page_count、或工具一次写满✅ 设计如此取消限制 → VACUUM;
4隐藏/历史表:程序保留备份、软删除表取决于需求删除对象 → VACUUM;
5非 SQLite:LiteDB、ESENT、LevelDB 等⚠️ 正常对应的 Shrink/Compact API

3 手动压缩:三步到位

?? 注意VACUUM 会生成 同大小临时文件,磁盘需有足够空间并加排他锁,务必在维护时间执行!

# 进入 sqlite3 shell
sqlite3 test.db-- 1) 看看是否在 WAL 模式
PRAGMA journal_mode;-- 2) 手动触发 checkpoint(若是 WAL)
PRAGMA wal_checkpoint(TRUNCATE);-- 3) 查看空闲页统计
PRAGMA freelist_count;-- 4) 真正压缩
VACUUM;.quit

若使用 LiteDB(C#):

using (var db = new LiteDatabase("test.db"))
{db.Rebuild(); // 等价于 VACUUM
}

压缩后,你会发现文件大小立刻降到 “活跃数据 + 索引” 所需空间。


4 线上环境的最佳实践

  1. 启用 WAL

    PRAGMA journal_mode=WAL;
    

    并定时

    PRAGMA wal_checkpoint(TRUNCATE);
    
  2. 开启 incremental_vacuum + 定期触发

    PRAGMA auto_vacuum=INCREMENTAL;
    PRAGMA incremental_vacuum;      -- 可以指定页数
    

    这样每晚只回收 N 页,避免一次性 I/O 峰值。

  3. 写扩散 vs. 瘦身平衡

    • 全量 VACUUM:文件最小、查询碎片最少,但重写成本高。
    • auto_vacuum=INCREMENTAL:每日轻量回收,I/O 峰值低。
      结合业务 QPS、磁盘 IOPS 选择折中方案。
  4. 监控 freelist_count + 文件大小
    通过 PRAGMA freelist_count; 与 Node 导出指标,当空闲页阈值 > 30 % 时触发压缩任务。


5 FAQ

问题解答
VACUUM 会锁表吗?会对整个 DB 加 排他锁,期间所有读写被阻塞。WAL 模式也不例外。
磁盘不足怎么压缩?可先复制到大磁盘、《或》用 VACUUM INTO 'new.db'; 再替换。
WAL 文件多大合理?官方建议 < 1 GiB;通过 PRAGMA wal_checkpoint(TRUNCATE) 清空到 ~0 字节。
能否自动释放?设置 auto_vacuum=FULL,但写放大会增 I/O;线上更常用 INCREMENTAL

结语

“删光数据文件却不变小” 99 % 都是因为你没有 VACUUM / Rebuild
了解单文件数据库的页式存储后,你就能自信地将文件瘦到最精简,也避免下次被 3 GB 大文件吓到。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/915121.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/915121.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何加固Web服务器的安全?

Web服务器是用户和公司联系的桥梁&#xff0c;Web服务器为用户交付网页内容和提供Web应用。正因为Web服务器是面向互联网的&#xff0c;所以成为了网络的攻击经常利用的一个入口。Web 服务器是企业数字化转型的 “前沿阵地”&#xff0c;其安全性不仅关乎技术层面的稳定运行&am…

MyBatis:配置文件完成增删改查_添加

1 实现添加操作 编写接口方法:Mapper接口编写sql语句&#xff1a;sql映射文件<insert id"add">insert into tb_brand(brand_name,company_name,ordered,description,status)values(#{brandName},#{companyName},#{ordered},#{description},#{status});</ins…

SGLang 推理框架核心组件解析:请求、内存与缓存的协同工作

SGLang 推理框架核心组件解析&#xff1a;请求、内存与缓存的协同工作 在当今大语言模型&#xff08;LLM&#xff09;服务的浪潮中&#xff0c;高效的推理框架是决定服务质量与成本的关键。SGLang 作为一个高性能的 LLM 推理和部署库&#xff0c;其内部精巧的设计确保了高吞吐量…

React学习笔记——Day2打卡

1、React表单控制 1.1 受控绑定 概念&#xff1a;使用React组件的状态&#xff08;useState&#xff09;控制表单的状态 完整示例&#xff1a; function App(){/* 1. 准备一个React状态值 */ const [value, setValue] useState()return (/* 2. 通过value属性绑定状态&#x…

用例测试方法5,6:状态迁移图和因果图

状态迁移图通过描绘系统的状态及引起状态转换的事件&#xff0c;来表示系统的行为例如&#xff1a;订机票l向航空公司打电话预定机票—>此时机票信息处于“完成”状态顾客支付了机票费用后—>机票信息就变为“已支付”状态旅行当天到达机场后&#xff0c;拿到机票后—>…

linux 脚本解释

if [ $? -ne 0 ]; thenecho "错误: 无法关闭现有 Tomcat 实例&#xff0c;终止启动流程!" >&2exit 1fi$? 是shell中的特殊变量&#xff0c;表示上一个命令的退出状态码-ne 0 表示"不等于0"(在Unix/Linux中&#xff0c;0通常表示成功&#xff0c;非…

Glary Utilities(系统优化工具) v6.20.0.24 专业便携版

GlaryUtilities 允许你清理系统垃圾文件&#xff0c;无效的注册表&#xff0c;上网记录&#xff0c;删除插件&#xff0c;查找重复文件&#xff0c;优化内存&#xff0c;修理或删除快捷方式&#xff0c;管理windows启动程序&#xff0c;卸载软件&#xff0c;安全删除文件&#…

VScode链接服务器一直卡在下载vscode服务器/scp上传服务器,无法连接成功

终极方案&#xff08;强力推荐&#xff0c;亲测有效&#xff0c;链接只需5秒钟&#xff09;&#xff1a;本地下载复制到mkdir -p ~/.vscode-server/bin/<commit_hash>里面 <commit_hash>可以从帮助->关于里面找到&#xff0c;如下所示 版本: 1.96.2 提交: fa…

基于Spring Boot的农村农产品销售系统设计与实现

随着现代农业的快速发展,传统农产品的销售模式逐渐暴露出信息闭塞、流通效率低和中间环节多等问题。为了打破这些瓶颈,我基于Spring Boot框架开发了一套农产品销售系统,旨在构建一座连接农民与消费者之间的数字桥梁,让优质农产品更高效地直达用户餐桌。 一、项目背景与目标…

Mysql默认存储引擎InnoDB和底层数据结构

在黑马点评项目实战中&#xff1a;谈到了为什么不推荐使用mysql的字段自增作为订单id传递给客户端&#xff0c;让我想到了Mysql的​​存储引擎​​和​​底层数据结构​​究竟是什么&#xff1f;它是如何实现自增的&#xff1f;本文主要是深度解析 MySQL 默认存储引擎 InnoDB 与…

原点安全签约金网络数科,共建一体化数据安全防护体系

金网络正式携手原点安全&#xff0c;基于原点安全一体化数据安全平台&#xff08;uDSP&#xff09;&#xff0c;启动企业数据安全平台建设项目&#xff0c;围绕数据资产盘点、敏感数据识别与分类分级、数据访问权限管控、数据动态脱敏、数据安全审计与风险监测等关键能力建设&a…

mix-blend-mode的了解使用

mix-blend-mode 是 CSS 的一个属性&#xff0c;用于控制元素的内容&#xff08;如文本、图像、背景等&#xff09;如何与其 父元素 或 背景 进行混合。它类似于图形设计软件&#xff08;如 Photoshop&#xff09;中的图层混合模式&#xff0c;可以实现各种视觉效果&#xff1b;…

vue自定义指令bug

问题描述&#xff1a;页面加载时&#xff0c;报已下错误。同时&#xff0c;页面数据不显示环境介绍&#xff1a;已经添加了vue自定义指令permission&#xff0c;实现如下&#xff0c;用以控制元素显示权限app.directive(permission, (el, binding) > {if (!store.hasPermiss…

Vue3 + WebSocket

Vue3与WebSocket结合能够很好地满足实时通讯的需求。通过合理设计和管理WebSocket连接的生命周期&#xff0c;以及实现必要的重连逻辑和心跳检测机制&#xff0c;可以构建出响应迅速且稳定的实时应用。WebSocketWebSocket允许服务端主动向客户端发送数据&#xff0c;无需客户端…

IPSec和HTTPS对比(一)

IPSec&#xff08;Internet Protocol Security&#xff09;是网络层&#xff08;OSI第3层&#xff09;的加密协议&#xff0c;其核心机制和与HTTPS的区别如下&#xff1a;&#x1f512; ​一、IPSec的核心机制解析​​1. 安全封装结构​┌──────────┬───────…

关于 c、c#、c++ 三者区别

1. 起源与定位语言起源时间开发者定位/特点C1972年Dennis Ritchie面向过程的编程语言&#xff0c;强调底层控制与高效性能C1983年Bjarne Stroustrup在 C 的基础上加入 面向对象编程&#xff08;OOP&#xff09;C#2000年微软&#xff08;Microsoft&#xff09;类似 Java&#xf…

项目总体框架(servlet+axios+Mybatis)

项目总体框架 先暂时这样子&#xff08;后续发现错误的话就改&#xff09; com.hope-tieba/ ← 项目根 ├─ .idea/ ← IDEA 工程配置 ├─ src/ │ ├─ main/ │ │ ├─ java/ │ │ │ └─ com/hope/ │ │ …

RestTemplate 实现后端 HTTP 调用详解

1. 方法签名解析方法名和返回类型说明了这个方法的业务意图和数据结构。Override 表示实现接口方法&#xff0c;利于规范开发和自动检查。Override public List<RobotInfo> listRobots() {这里 RobotInfo 是假设的业务数据结构&#xff0c;实际项目中按你的类名即可。2. …

Python单例模式详解:从原理到实战的完整指南

引言 单例模式是软件设计中最常用的模式之一&#xff0c;它确保一个类只有一个实例&#xff0c;并提供全局访问点。在Python中&#xff0c;实现单例模式有多种优雅的方式&#xff0c;本文将详细讲解6种主流实现方法&#xff0c;包含完整代码示例和注释。 一、模块级单例&#x…

拼团系统中的幂等性防护 , 前置性查询,Redis 库存预判

这段内容涉及两个关键点&#xff1a;幂等性防护 和 拼团目标量判断&#xff0c;下面我将分别解释这两个问题&#xff0c;并重点说明&#xff1a; “如果没有拦截&#xff0c;最终访问数据&#xff0c;也会有数量判断拦截。” 这句话的意思。 ✅ 1. 查询外部交易 outTradeNo 是…