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

2020-08-27 10:30:38 浏览数 (1)

摄影:产品经理

阳春面

MongoDB 3.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

0 人点赞