- A+
前言
当我们从MongoDB中删除文档或聚拢时,MongoDB并不会将已经占用了的磁盘空间开释,它会一直维护已经占用了磁盘空间的数据文件,只管数据文件中可能存在年夜年夜小小的空记载列表(empty record list)。当客户端法式再次插入文档时,MongoDB会从空记载列表中分派存储空间给新文档。那么为了加倍有用的使用磁盘空间,我们必要对mongodb的数据文件做碎片整顿以及未使用空间的收受接管。思惟无非两种:
1、对原数据进行重组
2、仅将数据复制出来,形成仅数据的完备备份
以下先容几种常用的实施办法:
1、compact
2、db.repairDatabase()
3、secondary节点重同步
4、db.copyDatabase()
一、compat
官网对该敕令的界说:对聚拢中的所稀有据和索引进行重写和碎片整顿。
使用办法
注意事变
1、在执行敕令前请保证你有比拟新的备份
2、在使用MMAPv1存储引擎的MongoDB上compact必要数据文件地点分区至少有2G的余暇空间
3、在使用WiredTiger存储引擎的MongoDB上,compact敕令将重写聚拢和索引,且开释未使用的空间,但使用MMAPv1存储引擎的MongoDB上,该敕令只对聚拢的数据文件进行碎片整顿并从新创立其索引。不会开释空间,在使用MMAPv1存储引擎的MongoDB上收受接管空间,建议使用第三种办法“secondary节点重同步”
4、使用MMAPv1存储引擎的MongoDB中的Capped Collections,是无法被紧缩的,但使用WiredTiger存储引擎的MongoDB在执行compact时会进行紧缩。
5、在副本集上运行该敕令时,要分离在每个节点执行
6、该敕令只能在mongod实例上执行,不克不及再mongos实例上运行。也便是说针对分片集群的compact操作要分离在每个分片节点上执行。
7、一样平常该敕令运行在secondary节点上,在执行时,会强制节点进入RECOVERING状况,RECOVERING状况的实例读写操作将被壅闭
8、再碰着特殊环境要结束运行该敕令时,可经由过程db.currentOp()查询过程信息,然后经由过程db.killOp()干失落过程
9、compact可能会增长数据文件的总年夜小和数目,尤其是第一次运行时。但这不会增长总聚拢使用的磁盘空间,由于存储年夜小是数据库文件中分派的数据量,而不是文件体系上文件的年夜小/数目
10、使用MMAPv1存储引擎的MongoDB中的Capped Collections,是无法被紧缩的,但使用WiredTiger存储引擎的MongoDB在执行compact时会进行紧缩。
二、db.repairDatabase()
官网该敕令的界说:经由过程丢无效或毁坏的数据老重修数据库和索引。相似于文件体系修复敕令fsck。以是此敕令主要是用于修复数据。
使用办法
注意事变
1、db.repairDatabase()主要用于修复数据。若你拥稀有据的完备副本,且有权限拜访,请使用第三种办法“secondary节点重同步”
2、在执行敕令前请保证你有比拟新的备份
3、此敕令会完全壅闭数据库的读写,谨严操作
4、此敕令执行必要数据文件地点地位有等同于所稀有据文件年夜小总和的余暇空间再加上2G
5、在使用MMAPv1存储引擎的secondary节点上执行该敕令可以紧缩聚拢数据
6、在使用WiredTiger存储引擎的MongoDB库上执行不会有紧缩的后果
7、再碰着特殊环境要结束运行该敕令时,可经由过程db.currentOp()查询过程信息,然后经由过程db.killOp()干失落过程
8、异常耗费光阴
三、secondary节点重同步
主要思惟便是:删除secondary节点中指定数据,使之与primary从新开端数据同步。当副本集成员数据太甚陈旧,也可以使用从新同步。数据的从新同步与直接复制数据文件分歧,MongoDB会只同步数据,是以重同步完成后的数据文件是没有空聚拢的,以此实现了磁盘空间的收受接管。
使用办法
起首必需确保数据有完备的备份。
1、若是primary节点,先强制将之变为secondary节点,不然跳过此步调:
2、然后在primary上删除secondary节点:
3、删除secondary节点dbpath下的所有文件。
4、将节点从新参加集群,然后使之主动进行数据的同步:
5、等数据同步完成后,轮回1-4的步调可以将集群中所有节点的磁盘空间开释
针对一些特殊环境,不克不及下线secondary节点的,可以新增一个节点到副本集中,然后secondary就主动开端数据的同步了。
总的来说,重同步的办法是比拟好的,第一根本不会壅闭副本集的读写,第二耗费的光阴相对前两种比拟短
四、db.copyDatabase()
mongodb还支撑在线复制数据:db.copyDatabase("大众from"大众,"大众to"大众,"大众IP:port"大众),此种办法也能开释空间,由于db.copyDatabase复制的数据,而不是表现在磁盘中的数据文件。但,该敕令在4.0版本起被弃用;3.x版本还能继续使用
如:
将源库sourceDB。拷贝为DistDB。
当然,该敕令支撑长途复制。
该敕令的完备语法为:
db.copyDatabase(<源数据库名称>, <目的数据库名称>, <源mongodb的IP:port>, <源数据库衔接必要的账户>,<暗码>, <mechanism>)
以上:敕令必需在目的数据库服务器上执行。若源数据库与目的数据库存在于一个MongoDB服务器,<源mongodb的IP:port>, <源数据库衔接必要的账户>,<暗码>都可省略。<mechanism>是身份验证类型,可选的。
注意事变
1、db.copyDatabase()不会壅闭源数据库和目的数据库数据的读写,是以可能会呈现两份数据纷歧致的环境
2、db.copyDatabase()复制索引数据会锁定数据库,此操作也会对其他数据库发生影响
3、db.copyDatabase()不要在mongos实例中使用
4、db.copyDatabase()不要用于复制包括分片聚拢的数据库
5、在4.0版中变动:db.copyDatabase()仅支撑SCRAM进行身份验证fromhost,<mechanism>选项。
6、某些分歧版本的MongoDB间不支撑此种复制办法,详见链接:https://docs.mongodb.com/manual/reference/method/db.copyDatabase/
除此之外,还有一些办法,像使用导入/导出的办法(mongodump/mongorestore),这种办法在数据量异常年夜的环境是不实用的,由于导入导出的办法使用的全量的情势,要保证有足够的余暇空间来寄存导入的数据。
总结
以上便是这篇文章的全体内容了,愿望本文的内容对年夜家的进修或者事情具有必定的参考进修代价,假如有疑问年夜家可以留言交流,谢谢年夜家对剧本之家的支撑。
您可能感兴致的文章:
mongodb 集群重构和开释磁盘空间实例详解详解肃清MongoDB所占用的过剩的磁盘空间的办法OpenStack Ceilometer用MongoDB办理占用磁盘空间过年夜问题巧妙的应用Mongodb做地舆空间查询