我有一个单主机数据库,在我不看的时候它增长了 95% 的磁盘空间。为了纠正这种情况,我创建了一个自动从最大集合中删除旧记录的进程,因此数据使用量下降到磁盘空间的 40% 左右。我认为只要数据大小不增长到接近预分配文件的大小我是安全的,但一周后我被证明是错误的:
Wed Jan 23 18:19:22 [FileAllocator] allocating new datafile /var/lib/mongodb/xxx.101, filling with zeroes...
Wed Jan 23 18:25:11 [FileAllocator] done allocating datafile /var/lib/mongodb/xxx.101, size: 2047MB, took 347.8 secs
Wed Jan 23 18:25:14 [conn4243] serverStatus was very slow: { after basic: 0, middle of mem: 590, after mem: 590, after connections: 590, after extra info: 970, after counters: 970, after repl: 970, after asserts: 970, after dur: 1800, at end: 1800 }
这是db.stats()
: 的输出(请注意,由于比例,数字以MB为单位)
> db.stats(1024*1024)
{
"db" : "xxx",
"collections" : 47,
"objects" : 189307130,
"avgObjSize" : 509.94713418348266,
"dataSize" : 92064,
"storageSize" : 131763,
"numExtents" : 257,
"indexes" : 78,
"indexSize" : 29078,
"fileSize" : 200543,
"nsSizeMB" : 16,
"ok" : 1
}
问题:如何阻止 MongoDB 分配新的数据文件?
运行repair
很困难,因为我必须安装新磁盘。跑步compact
有用吗?如果是,我应该定期运行它吗?我怎么知道我应该什么时候运行它?
更新:我想我在这里遗漏了一些基本的东西......有人可以详细说明数据文件、范围、集合和数据库之间的连接,以及在需要时如何分配空间?