You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB 4.2中如何计算collection已删除的精确存储空间

解决MongoDB 4.2中删除文档后无法获取已释放存储空间的问题

问题分析

MongoDB删除文档后不会立即回收对应磁盘空间,而是将这些空间标记为可复用状态,因此storageSize字段仍保留删除前的总占用值。MongoDB 5.0新增的freeStorageSize可直接获取这类可复用空间,但4.2版本需从WiredTiger引擎的底层统计数据中提取相关信息。

解决方案

1. 获取可复用磁盘空间大小

执行以下命令拉取集合完整的WiredTiger统计信息:

db.events.stats({ wiredTiger: true })

在返回结果的wiredTiger.block-manager节点下,bytes available for reuse字段的值即为已删除文档占据、尚未被回收的磁盘空间(单位:字节)。

示例输出片段:

"wiredTiger" : {
    "block-manager" : {
        "file size in bytes" : 4640121118720,
        "bytes available for reuse" : 1289746327560
    },
    // 其他WiredTiger相关字段...
}

2. 计算实际存储占用与已删除空间

  • 当前实际已使用磁盘空间 = storageSize(总存储大小) - bytes available for reuse(可复用空间)
    代入你提供的示例数据:4640121118720 - 1289746327560 = 3350374791160字节,约3.05TB。
  • 已删除的磁盘空间大小 = 原storageSize(4.2TB) - 当前实际已使用磁盘空间
    示例中为4.2TB - 3.05TB = 1.15TB(此值因压缩比差异,会与未压缩数据的删除量存在偏差)。

3. 手动回收可复用空间(可选)

若需将可复用空间释放给操作系统,可执行compact命令(注意:该操作会锁表,建议在业务低峰期执行):

db.runCommand({ compact: "events" })

执行完成后,再次查询storageSize即可看到回收后的实际占用大小。

内容的提问来源于stack exchange,提问作者vignesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 01:23:13