mongoDB磁盘碎片整理

Posted lc__________

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mongoDB磁盘碎片整理相关的知识,希望对你有一定的参考价值。

前序: 由于业务原因,需要将过期数据删除,之前也已经写了一篇关于如何定期删除数据的文章,但有一个问题出现了, 频繁删除数据之后,会产生很多磁盘碎片,这些碎片如果没有被重复利用,进而会影响查询性能(表查询时仍然会扫描这部分删除数据的磁盘空间块),随需要处理之
当从MongoDB中删除文档(Documents)或集合(Collections)后,MongoDB不会将Disk空间释放给OS,MongoDB在数据文件(Data Files)中维护Empty Records的列表。当重新插入数据后,MongoDB从Empty Records列表中分配存储空间给新的Document,因此,不需要重新开辟空间。为了更新有效的重用Disk空间,必须重新整理数据碎片。
有好几种方法处理: ①使用compact命令 ②重建collection ③新加一个secondary节点,然后将此节点切换为primary(数据量非常大的情况下,为了不影响业务) 后两种方法以后有时间再细说,也是网友提供的,今天只看Compact命令的实现
简介:      官方解释是:compact命令能够重写和重组集合的data和index      格式:           db.runCommand( compact: <collection name> ,force:<boolen>  )   ---红色部分是可选项      compact命令之后写你想要整理的collection名字      force参数用于replica set中primary整理时之用,否则会报错 说明:           在compact期间会阻塞其他针对此collection的操作,所以最好在业务不繁忙的时候进行compact动作;           针对compact完成之后,不同引擎会有不同的磁盘影响      WireTiger引擎:           在此引擎的数据库下,compact会整理碎片,并且释放未使用的磁盘空间给系统      MMAPv1引擎:           在此引擎的数据库下,compact会整理碎片,重建索引,但不会将未使用的空间释放给系统,后续新插入的数据依然可以使用这些空间      在复制集架构下的一些注意:           compact命令不会自动复制到secondary节点执行,compact在每个节点成员中都是独立的,在Primary,secondary中执行时都要使用force参数,           当在secondary的collection上执行compact命令时,此secondary节点会变成RECOVERING状态,且无法提供读操作      在capped collection中不必使用compact命令,因为它本身就是固定空间 测试验证:      在单实例情况下:      
           在复制集架构primary上使用时,如果不使用force参数,则会报错,如下:
     

若想要对着一个数据库的所有collection集合进行compact命令的话,可以参考使用repairDatabase命令哦
>use testDB
>db.runCommand(repairDatabase:1)
注:这个命令一定要谨慎使用,能不用的情况下尽量不用,因为会花费很多时间和性能
官网的一句话是这样说的:
The  repairDatabase command compacts all collections in the database. It is identical to running the compact command on each collection individually

以上是关于mongoDB磁盘碎片整理的主要内容,如果未能解决你的问题,请参考以下文章

mongo的碎片整理

磁盘碎片整理有啥用

为啥Linux不需要磁盘碎片整理 –

浅谈磁盘碎片整理的好处与方法

磁盘碎片整理功能无法启动,打开,提示“任务计划程序服务未运行,请启动后再试”,怎么解决?

关于Windows 7操作系统进行磁盘碎片整理时提示“已使用其他程序计划了磁盘碎片整理程序”的解决办法