mongodb 删除后为什么不释放空间
发布网友
发布时间:2022-04-20 13:39
我来回答
共2个回答
热心网友
时间:2022-04-08 02:28
原因是mongodb设计的本身机制问题造成的。
首先,mongodb在创建数据文件时,会根据64M,128M,256M...递增的方式产生数据文件,最大数据文件为2G,增大到2G之后,后面新增的数据文件都占用2G空间。
当删除某一个表的数据时,mongodb会标记你删除该表所在数据文件位置为:该部分的数据已经删除,但是不会释放该数据文件所占用的空间,当有新的数据进来之后,会将数据分配到该数据文件中。
一方面是:删除文件后不产生多余的数据碎片,
另一方面不做数据的大规模迁移,减少mongodb内部的IO操作。
所以在删除数据表之后,会发现系统空间并没有释放,从mongodb本身看,空间已经释放了,被删除数据的空间依然可用;
但从系统角度看,空间没有释放,并不会影响数据的存储。
热心网友
时间:2022-04-08 03:46
比较慢的方法:可以尝试给这个数据库增加一个 replica-set,等新加的结点和老数据同步了之后就可以停掉老数据库并删除老数据,以新结点对外提供服务,此时数据库空间应该已经整理好并压缩到最小了。这个过程自己并不可控,200 GB 的话要同步多久无法预估,但是不会太影响 mongodb 继续提供服务。
比较快的方法:用 mongomp/mongoexport 导出所有数据,可以远程导出,倒完之后再用 mongorestore/mongoimport 恢复数据。这个操作会导致 mongodb 锁数据库,无法对外提供服务,如果锁了也无所谓可以用这个方法,200 GB 说不定需要小半天的时间,得自己估量一下。
另外,db.repairDatabase() 效果很有限,且会导致长时间锁数据库,不用为好。mongodb 解决磁盘问题比较好的方法是用 auto-sharding 将数据分摊到多台机器上,不过这个事情得提前计划好,一旦数据库已经非常大了,能做的事情就很少了。