MongoDB compact 命令详解

为何须要 compact

一图胜千言spa

remove 与 drop 的区别

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

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

总的来讲,remove 会产生逻辑的空闲空间,这些空间能当即用于写入新数据,但文件占用的总物理空间不会当即回收;一般只要持续在写入数据,有物理空间碎片问题并不大,不须要去 compact 集合,有的场景,remove 了大量的数据后,后续的写入可能并很少,这时若是想回收空间,就须要显式的调用 compact。blog

compact 命令对读写的影响

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

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 的必要。get

如何预估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.io

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

执行 compact

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

// compact somedb.somecollection
 use somedb
 db.runCommnd({compact: "somecollection"})

 // compact oplog,在副本集primary上执行须要加 force 选项
 use local
 db.runCommnd({compact: "somecollection", force: true})


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

相关文章
相关标签/搜索