Replies: 2 comments 2 replies
|
旧数据其实是在自动清理的,问题出在 SQLite 不会因为删除数据就把文件缩小。
但连接参数里只设了这三个: query.Add("_pragma", "busy_timeout(5000)")
query.Add("_pragma", "foreign_keys(1)")
query.Add("_pragma", "synchronous(FULL)")没有 所以你看到的「越来越大」和清理没做是两回事。想真正把空间还给磁盘,停掉服务后手动执行一次就行: sqlite3 /path/to/your.db "VACUUM;"两个注意点。VACUUM 是重写整个数据库文件,过程中磁盘上需要有大约和现有文件同样大的空闲空间;另外它要拿独占锁,必须在服务停止的状态下做,不能一边跑一边清。 做完之后一般不需要定期重复。既然过期数据本来就在自动清理,文件大小会稳定在实际数据量对应的水平附近,除非你的数据规模本身还在持续增长。 |
|
CPAMP 这边确实有自动清理逻辑,不过清理的是对应的历史派生/统计数据,不代表所有历史数据都会统一删除。 SQLite 在当前这种使用方式下,DELETE 之后只是把页面标记为空闲,后续可以继续复用,但数据库文件本身通常不会立刻变小,所以看到 usage.sqlite 体积没有下降是正常的。 如果希望实际释放磁盘空间,可以对数据库执行 VACUUM。建议先停止 CPAMP,做好数据库备份后再执行,避免运行过程中持续写入带来的锁竞争或其他问题。 另外需要注意,VACUUM 重建数据库时会需要额外的临时磁盘空间。如果当前磁盘已经接近占满,不建议直接执行,最好先腾出足够空间。 |
CPAMP 这边确实有自动清理逻辑,不过清理的是对应的历史派生/统计数据,不代表所有历史数据都会统一删除。
SQLite 在当前这种使用方式下,DELETE 之后只是把页面标记为空闲,后续可以继续复用,但数据库文件本身通常不会立刻变小,所以看到 usage.sqlite 体积没有下降是正常的。
如果希望实际释放磁盘空间,可以对数据库执行 VACUUM。建议先停止 CPAMP,做好数据库备份后再执行,避免运行过程中持续写入带来的锁竞争或其他问题。
另外需要注意,VACUUM 重建数据库时会需要额外的临时磁盘空间。如果当前磁盘已经接近占满,不建议直接执行,最好先腾出足够空间。