4

我的 mongodb 占用 114g,这是我磁盘的 85%

尝试释放一些空间db.repairDatabase()会失败,因为我没有足够的可用空间

我知道我的数据不应该占用太多空间,因为我曾经有一个占用 90% 磁盘的大型集合。

然后我删除了这个集合,只重新插入了 20% 的数据。

我怎样才能释放一些空间?

4

1 回答 1

10

用于数据存储的磁盘空间由 MongoDB预先分配,只能通过使用新的预分配文件重建数据库来回收。通常这是通过db.repairDatabase()备份和恢复来完成的。正如您所指出的,修复需要足够的空间来创建数据库的新副本,因此可能不是一种选择。

以下是一些可能的解决方案,但都涉及在其他地方提供一些可用空间:

  • 如果有足够的可用空间来mongodump该数据库,您可以mongodump删除mongorestore它。 db.dropDatabase()将删除磁盘上的数据文件。

  • 如果您使用的是LVMZFS等卷管理器,则可以向逻辑卷添加额外的磁盘空间,以便修复或转储和恢复数据库。

  • 如果您有另一台服务器,您可以设置一个副本集来同步数据,而无需关闭当前服务器(这将是副本集中的“主要”服务器)。将数据同步到辅助服务器后,您可以降级原始主服务器并重新同步数据库。

请注意,对于副本集,您至少需要三个节点 .. 所以要么是三个数据节点,要么是两个数据节点加上一个仲裁器。在生产环境中,仲裁器通常会在第三台服务器上运行,因此如果当前主节点不可用,它可以允许任一数据节点成为主节点。在您回收磁盘空间的情况下,可以在其中一台服务器(可能是新服务器)上运行仲裁程序。

副本集通常对管理目的非常有帮助,因为它们允许您关闭服务器以进行维护(例如运行数据库压缩或修复),同时仍然有服务器可用于您的应用程序。它们还有其他好处,例如维护数据的冗余副本以进行自动故障转移/恢复。

于 2012-08-18T21:08:09.470 回答