为什么删除 110+ GB 的集合后,我的 /var/lib/mongodb 目录仍然大小相同?

为什么删除 110+ GB 的集合后,我的 /var/lib/mongodb 目录仍然大小相同?

我在 MongoDB 和空间使用方面遇到了一些问题。特别是,我曾经有一个大约 6 亿条记录的大型集合,总计 110+ GB 的磁盘空间。最近我决定删除它,因为数据已经过时了,为此我通过 rockmongo 的 Web 界面删除了该集合。因此,rockmongo 不再向我显示该集合,但我的磁盘使用情况根本没有变化。

是否存在我不知道的清理操作,必须运行该操作才能将数据库与磁盘上的数据库文件同步?

我试图执行“修复”,但系统抱怨磁盘空间不足......这是因为它全部被 MongoDB 使用。

答案1

与大多数数据库系统一样,删除数据时数据库文件不会缩小,数据只是被移除/标记为已删除,并且空间会被重新使用。

你需要跑到db.repairDatabase()紧凑的空间,正如所指出的这里

答案2

虽然从技术角度来看,上述 mongodump/drop/mongorestore 方法可以正常工作,但它要求您在执行此操作时将数据库脱机,这将是影响服务的事件。

如果你希望在不停机的情况下完成此操作,并且你正在使用 MongoDB 副本集[1],那么你可以这样做:

  1. 选择一个成员并在那里停止 MongoDB(服务 mongodb 停止)。如果这是主成员,则等待另一个成员被选为主成员。
  2. 删除此成员上的数据文件(cd /var/lib/mongodb; rm *)。
  3. 再次重新启动 MongoDB 服务(service mongodb start)。
  4. 等待成员重新同步到 PRIMARY(rs.status())。
  5. 这将仅重建所需的(较小的)数据文件。

然后对副本集中的每个其他成员重复上述步骤。

[1]https://docs.mongodb.org/manual/tutorial/deploy-replica-set

答案3

根据此常见问题解答https://docs.mongodb.com/manual/faq/storage/#faq-disk-size

唯一的方法是执行以下操作:

  • 设置新鲜且空的副本
  • 与 master 同步
  • 将其设置为主

答案4

为了在较新版本的 MongoDB 中回收磁盘空间,repairDatabase您应该使用compact它重写并整理集合中的所有数据和索引。

WiredTiger 存储引擎在删除文档时会维护数据文件中的空记录列表。WiredTiger 可以重复使用此空间,但除非在非常特殊的情况下,否则不会将其返回给操作系统。

WiredTiger 可供重复使用的空闲空间量反映在 db.collection.stats() 的输出中,标题为 wiredTiger.block-manager.file 可供重复使用的字节数。

为了让 WiredTiger 存储引擎将这些空白空间释放给操作系统,您可以对数据文件进行碎片整理。这可以使用 compact 命令来实现。有关其行为和其他注意事项的更多信息,请参阅 compact。

在 Mongo 4.4 之前,运行 compact 将阻止对数据库的所有操作。从 4.4 开始,它只会阻止集合删除和索引创建/删除。

请注意,在运行此类命令之前务必进行备份。

相关内容