如何调整MongoDB的固定集合大小而不丢失数据?

39

如何调整mongodb的固定集合大小而不丢失数据?

是否有相应的命令或可用的脚本呢?

3个回答

54

这是我调整被限制集合大小的做法:

db.runCommand({"convertToCapped": "log", size: 1000000000});

我已经有一个名为"log"的被限制集合。 因此,我只需再次运行"convertToCapped"命令并指定新的大小即可。 我没有尝试过缩小集合的大小。 这可能是您需要使用Scott Hernandez版本的地方。 但这种方法适用于增加被限制集合的大小而不会丢失任何数据或索引。


编辑:@JMichal是正确的。 数据被保留,但索引不会,需要重新创建。


5
减小收藏的大小的方法!这应该是正确的答案。 - sp-niemand
3
警告该命令会获取全局写锁并阻塞其他操作,直到它完成为止。 注:原文链接为 http://docs.mongodb.org/manual/reference/command/convertToCapped/ - Ján Sáreník
2
但它不会保留索引,所有索引都必须重新创建。 - Michał Jurczuk
1
看起来 convertToCappedcloneCollectionAsCapped 只支持原始封顶集合创建方法的字节大小选项。当您需要更改最大文档计数时,上面的答案似乎是唯一的方法。 - Furkan Mustafa
1
据我所知,这是调整oplog大小的唯一方法,因为您无法将其复制到其他地方。 - Hayko Koryun
我对这个答案有点困惑,因为MongoDB关于convertToCapped命令的文档(https://www.mongodb.com/docs/manual/reference/command/convertToCapped/)指出该命令“将现有的**非封顶**集合转换为同一数据库中的封顶集合”。因此,在我的理解下,它不能应用于已经封顶的集合。我的理解正确吗?或者MongoDB网站上的文档不正确? - fgalan

45

你需要创建一个新的有容量限制的集合,并将文档复制到其中。这可以在javascript(shell)或您选择的语言中轻松完成。

db.createCollection("new", {capped:true, size:1073741824}); /* size in bytes */
db.old.find().forEach(function (d) {db.new.insert(d)});
db.old.renameCollection("bak", true);
db.new.renameCollection("old", true);

注意:在切换集合之前,请确保没有人正在插入/更新旧集合。如果您在db.eval("....")中运行该代码,它会在运行时锁定服务器。

有一个增加现有集合大小的功能请求:http://jira.mongodb.org/browse/SERVER-1864


在我看来,@Quixrick(发布于2014年,比这个回答晚四年)更加“精准”,因此应该标记为“正确答案”。 - fgalan

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接