我们需要释放一些 MongoDB 空间,并且我们确定了可以从集合中安全删除的 100Gb 以上的文档。
因此,我们将它们从具有以下设置的测试环境中删除:
- MongoDB 3.0.1 版
- 没有分片
- 1 个节点,无副本
- 有线老虎引擎
完成后,我们发现磁盘上的空间仍在使用,需要回收。我们找到了这篇文章,它帮助了我们:在运行两者之后
db.runCommand({repairDatabase: 1})
和
db.runCommand({compact: collection-name })
我们释放了 100Gb +。
然后我们继续生产,忘记了设置是不同的,因为我们有 1 个副本节点:
- MongoDB 3.0.1 版
- 没有分片
- 1个主节点,1个副本节点
- 有线老虎引擎
删除文件后,我们运行
db.runCommand({repairDatabase: 1})
并收到OK消息(过了一会儿,10 分钟 +)。我们试着跑步
db.runCommand({compact: collection-name })
并得到这个错误:
不会在活动副本集主节点上运行紧凑,因为这是一个缓慢的阻塞操作。使用 force:true 强制
所以我们跑
db.runCommand({compact: collection-name, force: true })
并收到OK消息(几乎立即),但空间磁盘仍在使用,它没有被释放。
我们搜索了使用副本集运行repairDatabase
andcompact
命令的解决方案,但建议的重点是避免停机,好像这是唯一的问题。但是,我们可以安排停机时间,而我们的问题是命令不能按预期工作,因为空间实际上并没有被回收。
我们做错了什么?