删掉旧网关用量记录后db文件为何没变小,怎样估算VACUUM前的空间
删除行通常只是让数据库页可复用,文件不一定立刻缩小。先记录总页、空闲页和实际文件长度,再决定是否有必要在维护窗口重建文件;VACUUM前必须考虑额外磁盘与事务条件。
分清行删除与文件回收
保留期清理完成后,行数下降而db字节不动,不一定意味着DELETE无效。可复用空闲页能被下一批写入继续使用;如果数据量将稳定在相近规模,立即缩文件又迅速长回去,未必带来收益。先确认需求是释放宿主机磁盘,还是减少逻辑记录。
读取空闲页和文件尺寸
实验只生成数MB带固定blob的小库,删除四百行中的三百五十行。输出三阶段尺寸表,删除后文件长度保持、freelist增加,VACUUM后文件变小,保留行仍为五十。结果同时核对数据和容量,防止把误删大量有效数据导致的缩小当成成功回收。
一个便于交接的容量表至少应同时列出page_count、freelist_count、文件字节和保留行数。空闲页乘页大小可以帮助理解内部可复用容量,但不直接等于此刻可回收的文件尾部。删除后继续写入能复用这些页,是否收缩还应结合未来增长与维护成本决定。
核心表达式(完整建表与输入见附件):
PRAGMA page_count;
PRAGMA freelist_count;
说明备份与存储层副本仍可能保有旧内容
生产回收需要为重建预留空间,也应有可恢复的备份和明确的占用时段。不同页大小、自动回收设置、WAL状态与文件系统会改变具体字节,本文不提供通用压缩比例或耗时保证。VACUUM也不等同于安全擦除历史敏感内容。
适用范围:文件规模限定几MB,仅临时库;不宣称数据安全擦除或生产回收耗时。
配套样本与复核入口
- run.py:独立运行程序,包含合成输入、操作和正反例断言。
- case.json:输入说明、预期任务与适用范围,便于保存和交接。
- observed.json:本次实际执行输出;临时路径、进程号和计时可能随运行变化。
附件将生成与删除范围限制在临时小库,输出before、deleted和vacuumed三份记录。对照bytes、free与rows四个字段,不把缩文件作为唯一成功条件。真实维护计划可借用这张表的结构,另外补上可用磁盘、备份位置与维护时段;本次得到的字节数只是小样本,不适合放大成生产空间保证。
Python3.8以上及标准库;使用Python自带SQLite。程序不读取现有网关数据库,全部样本写入内存或新建临时目录,执行完自动清理;没有任何模型API调用。
python -B run.py
阅读输出时,先按case.json中的任务逐项核对SQLite删除数据文件不缩小,再与observed.json比较。非零退出表示依赖或断言需要处理,应保留实际错误。
一手依据1(DELETE默认留下可复用页;VACUUM重建文件可回收空间,须预留额外磁盘且不在活动事务内执行。);一手依据2(integrity_check不检查外键错误;foreign_key_check返回违反引用的行;freelist_count用于空闲页。)。
继续阅读:网关SQLite的WAL越长越大,怎样查出一直不结束的报表读事务;网关磁盘还有几十GB却写不了临时文件,怎样核对inode耗尽;网关stdout一直增长,怎样离线核对Docker日志轮转的磁盘预算。
不想自己搭网关、自己维护渠道?
力达云是托管的 OpenAI / Anthropic 双格式端点,一期提供 DeepSeek,注册送 ¥5 额度。