mongodb磁盘空间过大

joj*_*ojo 4 mongodb

我的mongodb需要114g,这是我磁盘的85%

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

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

然后我删除此集合并重新插入其数据的20%.

我怎么能释放一些空间?

Ste*_*nie 10

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

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

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

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

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

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

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