搜索

首页  >  问答  >  正文

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 }
漂亮男人漂亮男人2788 天前598

全部回复(2)我来回复

  • ringa_lee

    ringa_lee2017-05-02 09:26:24

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

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

    回复
    0
  • 伊谢尔伦

    伊谢尔伦2017-05-02 09:26:24

    下面是我的理解:

    1、对单个collection的compact,不会回收文件系统的存储空间;对整个数据库db.repairDatabase() ,才能回收文件系统的存储空间。请尝试使用repirDatabase()。

    2、另外也可以使用导出/导入collection的方式

    上述操作留心对系统性能的影响。供参考。

    这几天休假了,也提前祝春节假期快乐。

    Love MongoDB! Have Fun!

    回复
    0
  • 取消回复