天天看点

mongo碎片整理

一、前言:

当从MongoDB中删除文档或集合时,MongoDB并不会将已经占用了的磁盘空间释放,它会一直维护已经占用了磁盘空间的数据文件,只是逻辑上做了删除标记,其实未释放空间。当客户端程序再次插入文档时,MongoDB会从空记录列表中分配存储空间给新文档。所以在磁盘空间不足报警时等,为了释放空间,我们需要对mongodb的数据文件做碎片整理以及未使用空间的回收。

方法思路有两种:

进行碎片整理

数据重新拷贝搭建新从库

二、本次就compact操作记录下相关流程

定义:对集合中的所有数据和索引进行重写和碎片整理

命令:

步骤:

连接mongo实例scondary

切换至集合所在的数据库

use yourdatabase;

查看表占用空间大小

查询预估回收空间

上面命令得到的数字可以/1024/1024/1024得到大概G单位的可以释放的空间

执行以下命令,对某个集合进行碎片整理

等待执行,返回{ "ok" : 1 }代表执行完成

可查看collection占用空间释放被回收

注意:

只对WiredTiger引擎的mongo起作用

碎片整理期间,会堵塞实例的读写操作,故强烈建议在secondary上执行,然后切换主库,做轮询操作处理

操作的命令不会进行复制,故需要分别在不同的实例上单独执行一遍

碰到特殊情况要停止运行该命令时,可通过db.currentOp()查询进程信息,然后通过db.killOp()干掉进程