天天看点

MongoDB 删除数据后不释放空间?

​​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 删除数据后不释放空间?

如果你的 MongoDB 允许暂停读写操作,那么还可以在 Robo 3T 或者 Mongo Shell 中使用​

​compact​

​命令来释放空间。命令格式为:

db.runCommand({'compact': '集合名'})      

在 MongoDB 4.4之前的版本,​

​compact​

​会阻塞整个库的增删改查操作,所以需要暂停外部读写后才能执行。

在 MongoDB 4.4 或以后的版本,​

​compact​

​命令几乎可以在除了删除集合、增删索引外的任何时候执行。

参考资料