MongoDB / WiredTiger:从文档中删除属性后减少存储大小

cle*_*p6r 6 mongodb wiredtiger

我在 4 个节点的副本集上使用 MongoDB 3.4 和 WiredTiger 存储引擎。

我通过删除占用大部分空间的属性缩小了很多文档,但文档说此操作不会减小存储大小(仅减小数据大小),我可以确认这是真的。

所以我尝试使用compact命令:释放了一些空间,但存储大小仍然比数据大小大得多。是因为它只移动文档但不会减少每个文档已经分配的空间吗?

我是否需要删除并重新创建所有文档才能真正减小存储大小?

小智 5

只是为了澄清,请小心repairDatabase在副本集节点上使用。repairDatabase旨在用于抢救可读数据,即在磁盘损坏后,因此它可以删除不可读的数据,并让 MongoDB 在面临磁盘损坏时启动。

如果此节点有未检测到的磁盘损坏并且您repairDatabase在其上运行,这可能会导致该特定节点与其他节点具有不同的数据内容,因为repairDatabase. 由于 MongoDB 假设副本集中的所有节点都包含相同的数据,这可能会导致崩溃和难以诊断的问题。由于其性质,这个问题可能会长期处于休眠状态,并突然以报复的方式表现出来,似乎没有任何明显的原因。

WiredTiger 最终将使用新数据重用空白空间,并且WiredTiger 执行的定期检查点可能会潜在地向操作系统释放空间,而无需您进行任何干预。

如果您确实需要为操作系统提供空间,那么如果您有副本集,则初始同步是最安全的选择。在独立的情况下,转储/恢复将达到相同的结果。否则,compactrepairDatabase. 请在执行任何这些操作之前备份您的数据,因为在我看来这将被视为一项重大维护。


cle*_*p6r 0

我通过删除并重新创建文档,然后compact在我的集合上运行命令来成功。