我在 MongoDB 和空间使用方面遇到了一些问题。特别是,我曾经有一个大约 6 亿条记录的大型集合,总计 110+ GB 的磁盘空间。最近我决定删除它,因为数据已经过时了,为此我通过 rockmongo 的 Web 界面删除了该集合。因此,rockmongo 不再向我显示该集合,但我的磁盘使用情况根本没有变化。
是否存在我不知道的清理操作,必须运行该操作才能将数据库与磁盘上的数据库文件同步?
我试图执行“修复”,但系统抱怨磁盘空间不足......这是因为它全部被 MongoDB 使用。
答案1
与大多数数据库系统一样,删除数据时数据库文件不会缩小,数据只是被移除/标记为已删除,并且空间会被重新使用。
你需要跑到db.repairDatabase()
紧凑的空间,正如所指出的这里
答案2
虽然从技术角度来看,上述 mongodump/drop/mongorestore 方法可以正常工作,但它要求您在执行此操作时将数据库脱机,这将是影响服务的事件。
如果你希望在不停机的情况下完成此操作,并且你正在使用 MongoDB 副本集[1],那么你可以这样做:
- 选择一个成员并在那里停止 MongoDB(服务 mongodb 停止)。如果这是主成员,则等待另一个成员被选为主成员。
- 删除此成员上的数据文件(cd /var/lib/mongodb; rm *)。
- 再次重新启动 MongoDB 服务(service mongodb start)。
- 等待成员重新同步到 PRIMARY(rs.status())。
- 这将仅重建所需的(较小的)数据文件。
然后对副本集中的每个其他成员重复上述步骤。
[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 开始,它只会阻止集合删除和索引创建/删除。
请注意,在运行此类命令之前务必进行备份。