为什么需要 compact

一图胜千言

remove 与 drop 的区别

MongoDB 里删除一个集合里所有文档,有两种方式

  • db.collection.remove({}, {multi: true}),逐个文档从 btree 里删除,最后所有文档被删除,但文件物理空间不会被回收
  • db.collection.drop() 删除集合的物理文件,空间立即被回收

总的来说,remove 会产生逻辑的空闲空间,这些空间能立即用于写入新数据,但文件占用的总物理空间不会立即回收;通常只要持续在写入数据,有物理空间碎片问题并不大,不需要去 compact 集合,有的场景,remove 了大量的数据后,后续的写入可能并不多,这时如果想回收空间,就需要显式的调用 compact。

compact 命令对读写的影响

compact 一个集合,会加集合所在DB的互斥写锁,会导致该DB上所有的读写请求都阻塞;因为 compact 执行的时间可能很长,跟集合的数据量相关,所以强烈建议在业务低峰期执行,避免影响业务。

compact 具体做了什么?

Compact 动作最终由存储引擎 WiredTiger 完成,WiredTiger 在执行 compact 时,会不断将集合文件后面的数据往前面空闲的空间写,然后逐步 truancate 文件回收物理空间。每一轮 compact 前,WT 都会先检查是否符合 comapact 条件。

  1. 前面80%的空间里,是否有20%的空闲空间,用于写入文件后面20%的数据,或者
  2. 前面90%的空间里,是否有10%的空闲空间,用于写入文件后面10%的数据

如果上面都不满足,说明执行compact肯定无法回收10%的物理空间,此时 compact 就回退出。所以有时候遇到对一个大集合进行 compact,compact立马就返回ok,集合的物理空间也没有变化,就是因为 WiredTiger 认为这个集合没有 compact 的必要。

如何预估compact能回收多少空间?

The amount of empty space available for reuse by WiredTiger is reflected in the output of db.collection.stats() under the heading wiredTiger.block-manager.file bytes available for reuse.

mymongo:PRIMARY> db.coll.stats().wiredTiger["block-manager"]["file bytes available for reuse"]
5033984

执行 compact

执行前请确保你已经读懂了上面的内容,知道compact命令的原理、影响

// compact somedb.somecollectionuse somedbdb.runCommnd({compact: "somecollection"})// compact oplog,在副本集primary上执行需要加 force 选项use localdb.runCommnd({compact: "somecollection", force: true})

原文链接
本文为云栖社区原创内容,未经允许不得转载。

MongoDB compact 命令详解相关推荐

  1. MongoDB——删除命令详解

    语法 db.collection.remove(<query>, //删除条件{justOne: <boolean>,writeConcern: <document> ...

  2. 使用VS2010编译MongoDB C++驱动详解

    最近为了解决IM消息记录的高速度写入.多文档类型支持的需求,决定使用MongoDB来解决. 考虑到MongoDB对VS版本要求较高,与我现有的VS版本不兼容,在leveldb.ssdb.redis.h ...

  3. linux who命令功能,Linux who命令详解

    who 命令显示关于当前在本地系统上的所有用户的信息.显示以下内容:登录名.tty.登录日期和时间.输入whoami 显示您的登录名.tty.您登录的日期和时间.如果用户是从一个远程机器登录的,那么该 ...

  4. 04-mysql数据备份之mysqldump命令详解

    MYSQL数据备份之mysqldump命令详解 一.mysqldump 简介 mysqldump 是 MySQL 自带的逻辑备份工具. 它的备份原理是通过协议连接到 MySQL 数据库,将需要备份的数 ...

  5. MySQL--mysqldump命令详解

    MySQL–mysqldump命令详解 1.数据库信息 数据库地址:127.0.0.1 数据库用户名:root 数据库密码:1234 数据库名称:test1 数据库名称:test2 数据库名称:tes ...

  6. MySQL操作mysqldump命令详解

    MySQL操作mysqldump命令详解 基本命令: # 数据库备份-->mysqldump命令默认做锁表操作 mysqldump -uroot -ppassword --all-databas ...

  7. Linux系统与网络、磁盘参数和日志监控等命令详解二

    创作人QQ:851301776,邮箱:lfr890207@163.com, 欢迎大家一起技术交流,本博客主要是自己学习的心得体会,只为每天进步一点点! 个人座右铭: 1.没有横空出世,只要厚积一定发. ...

  8. docker常用命令详解

    docker常用命令详解 本文只记录docker命令在大部分情境下的使用,如果想了解每一个选项的细节,请参考官方文档,这里只作为自己以后的备忘记录下来. 根据自己的理解,总的来说分为以下几种: Doc ...

  9. oracle home 命令,$ORACLE_HOMEbin目录下所有命令的使用方法及命令详解

    求$ORACLE_HOME/bin目录下所有命令的使用方法及命令详解 如题. $ORACLE_HOME/bin目录下有很多命令,那我们平时用到的也不是太多,即使用到的那部分可能用法也不是完全能掌握,所 ...

最新文章

  1. [Flex]关于国内Flex开发者/从业者的调查问卷
  2. 字符的点阵显示(模拟户外广告显示屏)
  3. Yii2 Pjax的简单使用
  4. C语言 | C51实现MAX485通信(完整源代码)
  5. 【养成好习惯】使用pipreqs导出本项目使用的环境
  6. regsvr32.exe进程注册dll文件
  7. Mybatis3 源码解析系列
  8. Delphi自动清除临时文件及备份文件的批处理
  9. spring 之 AOP 理解
  10. 【社交分享SDK】ShareSDK for Android 2.5.9已经公布
  11. 数字化住宅小区对计算机网络有需求,浅谈智能小区宽带接入及其技术发展趋势...
  12. 人生如逆旅,我亦是行人——与余光中先生握一次手(一)
  13. 在使用计算机时可以用什么键关机,计算机快捷键怎么用(按什么),关机、睡眠等?...
  14. python colorbar字体大小_如何更改colorbar上基数和指数的字体大小?
  15. Centos7开地狱已满服之插件安装
  16. 数字摄像头java sdk_java海康摄像头SDK集成
  17. java string 编码_java中GBK编码格式转成UTF8,用一段方法实现怎么做?
  18. 基于IIC和SPI协议的OLED显示(STM32)
  19. java list按字母排序_如何按字母顺序对列表进行排序?
  20. poss八十七氟癸基/白色粉末状/溶于氟类树脂/自修复超疏水材料

热门文章

  1. java不同进程的相互唤醒_Java多线程(二)同步与等待唤醒
  2. 计算机网络 --- 传输层UDP协议
  3. 云计算的概念_近500亿资金汹涌出逃!云计算概念龙头抛压沉重,科技股资金出逃名单出炉...
  4. python 多条件 选择 算法_浅析Python中的多条件排序实现
  5. python网页开发好用吗_推荐用于Web开发的最好 Python 框架
  6. 算法 | 一段C语言和汇编的对应分析,揭示函数调用的本质
  7. 励志!26岁单臂博士生:我想在科研的道路上发更多高质量论文
  8. To 研究生,第一:做学位论文期间,不要有任何度假休息的打算;第二,导师错的时候不多;第三……...
  9. 刚毕业的他仅用1年就拿下了年薪30W的阿里数据分析岗
  10. 菲尔茨奖得主丘成桐在清华设立数学英才班,比肩清华姚班