mongodb磁盘碎片整理

mongodb磁盘碎片产生

  • 删除文档或集合后,mongodb不会将disk空间释放的为OS,mongodb会在数据文件中维护Empty Records的列表。 重新插入数据后,mongodb从Empty Records列表中分配的存储空间给新的文档

一、整理数据碎片的方法

  1. 使用compact命令
  2. 新加一个secondary节点,然后的将此节点切换为primary,一般在数据量非常大的情况下使用
  3. 重建collection

二、查看集合大小等信息

// 查看集合大小
db.collection_name.storageSize()

// 查看的集合索引大小
db.collection_name.totalIndexSize()

// 查看预计回收内存
db.collection_name.stats().wiredTiger["block-manager"]["file bytes available for reuse"]

三、使用compact命令回收

  • 能够重写和重组集合的data和index
  • 在compact期间会阻塞其他针此collection的操作,最好在业务低峰期进行
  • 在WriedTiger引擎下,compact会整理碎片后并且释放未使用的磁盘空间给系统
  • 在MMAPv1引擎下,compact会整理碎片,重建索引,但是不会将未使用的空间释放会给系统,而是重新分配给新插入的数据
使用语法:

db.runCommand({compact:<collection name>,force:<boolen>})

  • collection name:集合名称
  • force:用于副本集中primary节点整理时使用,否则会报错
// primary节点上执行
rs1:PRIMARY> db.runCommand({compact:"test"})
{
        "ok" : 0,
        "errmsg" : "will not run compact on an active replica set primary as this is a slow blocking operation. use force:true to force",
        "operationTime" : Timestamp(1643269045, 1),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1643269045, 1),
                "signature" : {
                        "hash" : BinData(0,"o/GQKZEvC/Tp9T1QQePHdyT0xKo="),
                        "keyId" : NumberLong("7057052573554966530")
                }
        }
}
rs1:PRIMARY> db.runCommand({compact:"test",force:true})
{
        "operationTime" : Timestamp(1643269055, 1),
        "ok" : 0,
        "errmsg" : "collection does not exist",
        "code" : 26,
        "codeName" : "NamespaceNotFound",
        "$clusterTime" : {
                "clusterTime" : Timestamp(1643269055, 1),
                "signature" : {
                        "hash" : BinData(0,"Srm0HtbcI/6BZv6WXCZeXzdvBLA="),
                        "keyId" : NumberLong("7057052573554966530")
                }
        }
}

// secondary节点上执行
rs1:SECONDARY> db.runCommand({compact:"test"})
{
        "ok" : 1,
        "operationTime" : Timestamp(1643269025, 1),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1643269025, 1),
                "signature" : {
                        "hash" : BinData(0,"27nvRIvAmDLzwpO2bKxQ4Z3KuBw="),
                        "keyId" : NumberLong("7057052573554966530")
                }
        }
}

四、创建新的secondary回收空间

  • 不会阻塞副本集的读写
  • 消耗时间相对较短
  • 索引会自动创建,不需要手动创建
  • 不能用于复制包含分片集合的数据库

五、重建collection

// 创建新集合
db.createCollection("collection_name_new")
// 手动重建索引
db.collection_name_new.createIndex({"col_name":1},{"background":1})
// 从旧集合复制到新集合
db.collection_name_new.aggregate({$match:{}},{$out:"collection_name_old"})
// 重新命名集合
db.runCommand( { renameCollection: ".collection_name_new", to: ".collection_name" })
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
mongodb的磁盘回收可以通过备份恢复和删除数据来实现。备份恢复是一种常用的方法,可以使用mongodump命令将数据库备份到指定目录,然后使用mongorestore命令将备份数据恢复到数据库中。这样可以释放一部分磁盘空间。\[1\] 另外,需要注意的是,当删除数据时,mongodb并不会立即释放占用的磁盘空间给操作系统。即使使用drop collection命令删除集合,也不会释放给操作系统,除非使用drop database命令。在dbshell中使用db.serverStatus().mem命令可以看到磁盘空间占用显示已经释放,但是使用df命令查看操作系统的空闲磁盘空间时,可能并没有变化。这是因为mongodb会在数据文件中维护一个空记录列表,删除文档或集合后,mongodb会将空记录列表中的存储空间分配给新的文档。\[2\]\[3\] 因此,如果需要回收mongodb的磁盘空间,可以通过备份恢复和删除数据的方式来实现。 #### 引用[.reference_title] - *1* *2* [mongodb磁盘满故障](https://blog.csdn.net/sunny05296/article/details/106651111)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [mongodb磁盘碎片整理](https://blog.csdn.net/weixin_44375561/article/details/122728272)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值