【发布时间】:2013-11-13 09:05:15
【问题描述】:
我们一直在单个非分片实例中运行 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
}
>
【问题讨论】:
-
如果您没有任何碎片(由于删除、文档移动等),则不会回收任何空间。为什么不向 db.stats() 和个人收集统计信息提供输出?是什么让你认为有任何可回收的空间?不要忘记索引空间。
-
我添加了每个集合和索引的 storageSize。这等于 85 MB。
-
你知道预分配对吧? docs.mongodb.org/manual/faq/storage/… 前两个文件中有数据,第三个文件是预先分配的,这样当您填充 128MB 文件时,数据库不必在等待下一个文件分配时暂停。
-
@AsyaKamsky,让我知道以下是否正确: 如果总数据大小为 64+128+256+512+20 如果总文件大小为 64+128+256+512+1024 +2048 在这种情况下,不会回收任何文件,因为预先分配了一个额外的块。但是,如果总数据大小为 64+128+256+512+20 如果总文件大小为 64+128+256+512+1024+2048+2048,则最后一个 2048 MB 的文件将被回收。让我知道我的理解是否正确。
-
最后一个(最大的)文件总是空的。我不确定我是否可以解析您的方程式,但如果您的数据需要两个数据文件,那么您将在目录中看到三个(除了 .ns 文件)。
标签: mongodb