mongodb如何回收文档“缩水”后应该腾出的空间?

查看:86
本文介绍了mongodb如何回收文档“缩水”后应该腾出的空间?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

使用版本为mongodb-win32-x86_64-3.2.1,用的默认的WiredTiger存储引擎。

一个collection中有大约400万文档,占用40G空间;后来遍历删除每个文档处理中无用的部分并更新(未删除文档),执行此任务的脚本如期运行完成,根据其输出统计,文档整体缩减到原来45%左右,也就是有20G多些的空间被腾出来了,但数据库文件体积没有变小,反而增大了一点点(1%左右)。

看了文档中关于存储的章节,https://docs.mongodb.com/v3.2...,其中提到删除文档导致的空记录占用空间可通过compact回收(使用WiredTiger存储引擎时),没提到前述这种修改文档形成的虚占空间的情形,我运行了compact,几秒钟就结束了,存储文件没有变小。那么该怎么办呢?

> use cache
switched to db cache
> db.htmldocs.runCommand("compact")
{ "ok" : 1 }
> db.runCommand({compact: "htmldocs"})
{ "ok" : 1 }

解决方案

没错,WT使用最新版本的话compact确实可以回收空间,但是因为某个bug这应该是在3.2的某个版本之后生效的,我不记得具体版本号(3.2.9?),但是可以肯定3.2.1肯定无效,而升级到最新版本3.2.12肯定能解决这个问题。
相对于repairDatabase来说,compact看起来确实要轻量级一些,但是不能回避的问题是,它仍然是一个很重的操作。设想一下windows的磁盘碎片整理,原理是一样的。更推荐的,影响更小的做法是使用复制集滚动重新初始化所有结点,空间即可被释放。

更重要的问题是,回收这些空间是否对你真的有意义?大部分时候系统占用过这些空间就意味着它有可能再次占用这些空间(除非系统设计上有变动)。与其释放掉到时候再重新分配一次,不如保持在那系统也会重复利用。

这篇关于mongodb如何回收文档“缩水”后应该腾出的空间?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆