单机单节点 MongoDB 为什么删除数据后不释放空间?

2021-06-16 15:37:55 浏览数 (1)

MongoDB3.6 以后,默认使用的储存引擎是 WiredTiger。这个引擎有一个特点,就是删除数据不释放空间。例如现在你的一个集合里面有 10000000 条数据,占用 10GB 的硬盘空间。你把其中的 9999999 条数据都删了,占用空间仍然是 10GB。

如果你想释放空间,最直接的方法是删除整个集合(Drop Collection)或者删除整个数据库(Drop Database)。

如果你的 MongoDB 版本小于 4.4,但是大于等于 3.6,那么虽然删除了数据,磁盘空间不会释放,但当你插入新的数据时,MongoDB 会重用之前占有的空间,而不会继续额外占用新的磁盘空间。

例如你的集合有 10GB,你删除了 9999999 条数据,接下来,在你新插入的数据总大小超过 10GB 前,MongoDB 都不会申请额外的硬盘空间。

我们可以在 Robo 3T 上,通过查看集合的统计信息找到当前集合可重复使用的空间大小。在集合上右键,选择 Statistics,从返回的统计数据中,展开 wiredTiger-block-manager-file bytes available for reuse。这里显示的数据就是当前集合可重用的空间大小。如下图所示。

如果你的 MongoDB 允许暂停读写操作,那么还可以在 Robo 3T 或者 Mongo Shell 中使用 compact 命令来释放空间。命令格式为:
代码语言:javascript复制
db.runCommand({'compact': '集合名'})

在 MongoDB 4.4 之前的版本,compact 会阻塞整个库的增删改查操作,所以需要暂停外部读写后才能执行。

在 MongoDB 4.4 或以后的版本,compact 命令几乎可以在除了删除集合、增删索引外的任何时候执行。

关于 compact 命令的更多说明,可以阅读 compact — MongoDB Manual[1]。

参考资料

[1] compact — MongoDB Manual: https://docs.mongodb.com/manual/reference/command/compact/#dbcmd.compact

via: https://mp.weixin.qq.com/s/9PbfaN9zn28LCswY3v86QQ

0 人点赞