摄影:产品经理
阳春面
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
命令来释放空间。命令格式为:
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