尽管运行repairDatabase(),但MongoDB不会回收空间

时间:2013-11-13 09:05:15

标签: mongodb

我们一直在单个unsharded实例中运行mongoDB,只有一个数据库。数据文件的大小为0.45 GB。当我查看所有集合的storageSize时,总大小约为85 MB。为了回收未使用的空间,我们运行了repairDatabase(),并了解文件大小从64增加到128到256,依此类推,直到2 GB。由于我们拥有的mongo对象数据(85 MB)可以容纳在64 + 128 MB文件中,因此我们期望回收256 MB文件。然而,令我们惊讶的是,没有回收空间。

有人能告诉我们基于哪些逻辑我们可以找到回收多少空间?基本上,给定数据库占用的总磁盘空间,并且给定总mongo对象数据大小,可以准确估计将回收多少空间?

以下是注释中请求的db.stats()输出:

> db.stats()
{
        "db" : "analytics_data_1",
        "collections" : 12,
        "objects" : 207223,
        "avgObjSize" : 353.6659347659285,
        "dataSize" : 73287716,
        "storageSize" : 84250624,
        "numExtents" : 43,
        "indexes" : 26,
        "indexSize" : 21560112,
        "fileSize" : 469762048,
        "nsSizeMB" : 16,
        "dataFileVersion" : {
                "major" : 4,
                "minor" : 5
        },
        "ok" : 1
}
>

1 个答案:

答案 0 :(得分:2)

storage FAQ explains额外文件始终是预先分配的,一旦您开始写入,mongod将预先分配下一个文件。

修复不会回收通常存在的任何空间 - 它只有在您删除了大量数据或删除了一些集合时才有用。

禁用预分配可以节省空间,但会降低性能,因为文件将在实际需要写入时进行分配 - 这会降低插入速度。