mongodb 删除后为啥不释放空间

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mongodb 删除后为啥不释放空间相关的知识,希望对你有一定的参考价值。

参考技术A 原因是mongodb设计的本身机制问题造成的。
首先,mongodb在创建数据文件时,会根据64M,128M,256M...递增的方式产生数据文件,最大数据文件为2G,增大到2G之后,后面新增的数据文件都占用2G空间。
当删除某一个表的数据时,mongodb会标记你删除该表所在数据文件位置为:该部分的数据已经删除,但是不会释放该数据文件所占用的空间,当有新的数据进来之后,会将数据分配到该数据文件中。

一方面是:删除文件后不产生多余的数据碎片,
另一方面不做数据的大规模迁移,减少mongodb内部的IO操作。
所以在删除数据表之后,会发现系统空间并没有释放,从mongodb本身看,空间已经释放了,被删除数据的空间依然可用;
但从系统角度看,空间没有释放,并不会影响数据的存储。
参考技术B 比较慢的方法:可以尝试给这个数据库增加一个 replica-set,等新加的结点和老数据同步了之后就可以停掉老数据库并删除老数据,以新结点对外提供服务,此时数据库空间应该已经整理好并压缩到最小了。这个过程自己并不可控,200 GB 的话要同步多久无法预估,但是不会太影响 mongodb 继续提供服务。

比较快的方法:用 mongodump/mongoexport 导出所有数据,可以远程导出,倒完之后再用 mongorestore/mongoimport 恢复数据。这个操作会导致 mongodb 锁数据库,无法对外提供服务,如果锁了也无所谓可以用这个方法,200 GB 说不定需要小半天的时间,得自己估量一下。

另外,db.repairDatabase() 效果很有限,且会导致长时间锁数据库,不用为好。mongodb 解决磁盘问题比较好的方法是用 auto-sharding 将数据分摊到多台机器上,不过这个事情得提前计划好,一旦数据库已经非常大了,能做的事情就很少了。本回答被提问者采纳

MongoDB: 数据库复制

db.copyDatabase("from","to","127.0.0.1:16161");

将127.0.0.1上的from库。拷贝到to库。

这样做有一个额外的好处。就是from库中可能是删除过数据的库。看我们知道删除数据时磁盘空间是不会被释放的。参考博客里的另一篇文章:mongodb删除集合后磁盘空间不释放

肯能造成占用很大磁盘空间。虽然可以用    db.repairDatabase()修复数据。但这种方法有两个不好的地方。1.在生产上操作如果意外停止可能会造成数据无法恢复的危险。2.如果磁盘空间不足,小于现在这个db时间占有的空间,这种情况是用不了    db.repairDatabase()的。

所以介绍用db.copyDatabase可以备份复制数据的方法。

1.db.copyDatabase("from","to","127.0.0.1:16161");复制出一个新的to数据库。这个已经是最小数据占用的数据。会在数据目录下产生to的相关数据文件。

2.将所有程序的配置从from库改为to库。测试无误。

3.这时可以删除from库。方法。use from 后 db.dropDatabase()。这个方法的好处是可以时间将磁盘上的数据删除掉。节省出很大的空间。

以上是关于mongodb 删除后为啥不释放空间的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB如何释放空闲空间?

mongodb 磁盘空间啥时候释放

MongoDB释放磁盘空间

mongodb锁表怎么释放

文件删除了空间却不释放,为啥

mongo的碎片整理