MongoDB磁盘碎片清理(占用磁盘空间处理办法)

admin2021-12-11编程日志3872

前言

    MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。

    MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

MongoDB磁盘碎片产生原因

    MongoDB在使用过程中,因存在删除操作,当用户从MongoDB中删除文档Documents或集合Collections后,系统并不会将磁盘空间释放,这就会产生磁盘碎片,这些碎片如果没有被重复利用,最后表查询时仍然会扫描这部分删除数据的磁盘空间块。

处理方法

    1. 使用compact命令

    compact是mongoDB中的压缩命令,可以整理删除数据产生的碎片。

    在WiredTiger 数据库引擎下,该命令会将整理出的空间释放给操作系统。

    在MMAPv1引擎下,compact会整理碎片,重建索引,但不会将未使用的空间释放给系统,后续新插入的数据依然可以使用这些空间。

// 使用方式:
db.runCommand({compact:<collection name>,force:<boolen>})

    2. secondary节点重同步

    删除secondary节点中指定数据,使之与primary重新开始数据同步。当副本集成员数据太过陈旧,也可以使用重新同步。数据的重新同步与直接复制数据文件不同,MongoDB会只同步数据,因此重同步完成后的数据文件是没有空集合的,以此实现了磁盘空间的回收。

    step1: 如果是primary节点,先强制将之变为secondary节点,否则跳过此步骤:

rs.stepdown(120);

    step2: 在primary上删除secondary节点:

rs.remove("host:port");

    step3:删除secondary节点dbpath下的所有文件。

    step4:将节点重新加入集群,然后使之自动进行数据的同步:

rs.add("host:port");

等数据同步完成后,循环1-4的步骤可以将集群中所有节点的磁盘空间释放

    3. db.copyDatabase()

    MongoDB还支持在线复制数据:db.copyDatabase("from","to","IP:port"),此种方法也能释放空间,因为db.copyDatabase复制的数据,而不是表示在磁盘中的数据文件。但该命令在4.0版本起被弃用;3.x版本还能继续使用如:

db.copyDatabase("sourceDB","DistDB");


发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。