1、问题描述:

今天看到公司mongodb的oplog有点大,看到云数据库MongoDB版日志清理策略。

MongoDB数据库在长期频繁地删除/写入数据或批量删除了大量数据,将产生很多物理空间碎片。

这些碎片将占用磁盘空间,降低磁盘利用率。

您可以对集合中的所有数据和索引进行重写和碎片整理,释放未使用的空间,提升磁盘利用率和查询性能。

下图说明:

2、前提条件

mongo实例的存储引擎为WiredTiger。

3、详细信息

  • 用户禁止使用 db.repairDatabase命令。
  • 日志占用空间过大时,会触发自动清理策略。

4、注意事项

  • 执行该操作前,建议对数据库进行备份
  • 执行该操作会导致集合所属的数据库被锁定,且该数据库的读写操作将被阻塞,请在业务低峰期操作。
  • 说明:执行物理空间回收命令(compact)所需的时间与集合数据量、系统负载等因素有关。

5、remove与drop的区别

MongoDB 里删除一个集合里所有文档,有两种方式

  • db.collection.remove({}, {multi: true}),逐个文档从 btree 里删除,最后所有文档被删除,但文件物理空间不会被回收
  • db.collection.drop() 删除集合的物理文件,空间立即被回收

multi:可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。

总的来说:

新写入的数据将会使用未被回收的物理空间,所以在数据持续写入的场景中,不需要频繁执行compact命令整理物理空间碎片。

有的场景,remove 了大量的数据后,后续的写入可能并不多,这时如果想回收空间,就需要显式的调用 compact。

6、compact 具体做了什么?

Compact 动作最终由存储引擎 WiredTiger 完成,WiredTiger 在执行 compact 时,会不断将集合文件后面的数据往前面空闲的空间写,

然后逐步 truancate 文件回收物理空间。每一轮 compact 前,WT 都会先检查是否符合 comapact 条件。

  1. 前面80%的空间里,是否有20%的空闲空间,用于写入文件后面20%的数据,或者
  2. 前面90%的空间里,是否有10%的空闲空间,用于写入文件后面10%的数据

如果上面都不满足,说明执行compact肯定无法回收10%的物理空间,此时 compact 就回退出。

所以有时候遇到对一个大集合进行 compact,compact立马就返回ok:1,集合的物理空间也没有变化,就是因为 WiredTiger 认为这个集合没有 compact 的必要。

7、预估回收的物理空间

1、连接mongo实例parmary或scondary

2、切换至集合所在的数据库。

use <database_name>

3、执行下列命令查询预估回收空间。

db.<collection_name>.stats().wiredTiger["block-manager"]["file bytes available for reuse"]

4、执行结果示例:

整理单节点实例/副本集实例的碎片

1、通过mongo shell连接MongoDB实例的Primary节点

2、切换至集合所在的数据库。

use <database_name>

3、执行db.stats()命令查看碎片整理前数据库占用的磁盘空间。

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

db.runCommand({compact:"<collection_name>",force:true})

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

6、碎片整理完毕后,可通过db.stats()命令查看碎片整理后数据库占用的磁盘空间

本案例碎片整理前后的对比如下图所示:

参数说明:

<database_name>:数据库名。
<collection_name>:集合名。
force为可选项,如您需要在副本集实例的Primary节点执行该命令,需要设置force的值为true。
compact操作不会传递给Secondary节点,当实例为副本集实例时,请重复上述步骤通过mongo shell连接至Secondary节点,执行碎片整理命令。

整理分片集群实例的碎片

1、通过mongo shell连接分片集群实例中的任一mongos节点

2、执行db.stats()命令查看碎片整理前数据库占用的磁盘空间。

3、执行以下命令,对Shard节点中的Primary节点进行集合的碎片整理。

db.runCommand({runCommandOnShard:"<Shard ID>","command":{compact:"<collection_name>",force:true}})

4、执行以下命令,对Shard节点中的Secondary节点进行集合的碎片整理。

db.runCommand({runCommandOnShard:"<Shard ID>","command":{compact:"<collection_name>"},queryOptions: {$readPreference: {mode: 'secondary'}}})

参数说明:

<Shard ID>:Shard节点ID。
<collection_name>:集合名。

碎片整理完毕后,可通过db.runCommand({dbstats:1}) 命令查看碎片整理后数据库占用的磁盘空间。

云数据库MongoDB版清理oplog日志和compact命令详解的更多相关文章

  1. 云数据库 MongoDB版

    阿里云云数据库MongoDB版是一种安全可靠.可弹性伸缩的云数据库服务,目前支持ReplicaSet和Sharding两种部署架构,通过简单的几步操作即可快速部署.阿里云云数据库MongoDB版是一种 ...

  2. 什么是云数据库 HBase 版

    云数据库 HBase 版(ApsaraDB for HBase)是基于 Hadoop 的一个分布式数据库,支持海量的PB级的大数据存储,适用于高吞吐的随机读写的场景.目前在阿里内部有数百个集群,100 ...

  3. 公网访问阿里云数据库MongoDB——填坑日记

    业务情景 两台服务器,一台阿里云ECS云服务器(专用网络),另一台是阿里云数据库MongoDB,处于安全考虑MongoDB是不运行外网连接的,那接下来就看怎么实现公网访问. 看到上面红色的网络类型描述 ...

  4. 云数据库Redis版256M双机热备款

    云数据库Redis版是兼容Redis协议标准的.提供持久化的缓存式数据库服务,基于高可靠双机热备架构:全新推出的256M小规格款,适用于高QPS.小数据量业务,并支持免费全量迁移,完美服务于个人开发者 ...

  5. 阿里云数据库MySQL版快速上手!

    MySQL是全球最受欢迎的开源数据库,其在各Web应用中均有广泛部署.阿里云数据库MySQL版基于Alibaba的MySQL源码分支,经过双11高并发.大数据量的考验,拥有优良的性能和吞吐量.除此之外 ...

  6. 云数据库 Redis 版,知识点

    资料 网址 什么是云数据库Redis版 https://help.aliyun.com/document_detail/26342.html?spm=a2c4g.11174283.6.542.6b11 ...

  7. 云数据库 MariaDB 版

    基于MariaDB企业版全球独家合作认证,提供Oracle兼容性及众多企业级数据库特性.支持包括MySQL InnoDB等多种存储引擎,为不同需求的用户提供灵活的选择. 请看视频简介 优势 Oracl ...

  8. 云数据库 Redis 版

    首先观看视频简介 云数据库 Redis 版是一项易于部署和管理的按需数据库服务,与 Redis 协议兼容.云数据库 Redis 版通过从内存缓存中检索数据而提供高速数据读写功能,并通过同时使用内存和硬 ...

  9. 选择阿里云数据库HBase版十大理由

    根据Gartner的预计,全球非关系型数据库(NoSQL)在2020~2022预计保持在30%左右高速增长,远高于数据库整体市场. 阿里云数据库HBase版也是踏着技术发展的节奏,伴随着NoSQL和大 ...

随机推荐

  1. JavaEE基础(05):过滤器、监听器、拦截器,应用详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.Listener监听器 1.概念简介 JavaWeb三大组件:Servlet,Listener,Filter.监听器就是指在应用程序中监听 ...

  2. Python3、setuptools、Pip3安装详解

    Python3.setuptools.Pip3安装详解 2017年08月19日 18:58:47 安静的技术控 阅读数:26002    版权声明:本文为博主原创文章,未经博主允许不得转载. http ...

  3. hdu 2586 How far away?(LCA模板题+离线tarjan算法)

    How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  4. 《Java基础知识》Java注解"@"详解

    Java注解含义: Java注解,顾名思义,注解,就是对某一事物进行添加注释说明,会存放一些信息,这些信息可能对以后某个时段来说是很有用处的.Java注解又叫java标注,java提供了一套机制,使得 ...

  5. VS2019 开发Django(十)------JavaScript与Django的数据交互

    导航:VS2019开发Django系列 这一篇介绍如何使用BootStrap Table这个组件来绑定渲染数据, 1)先来看一下BootStrap Table是怎么绑定数据的. 通过数据属性 给定da ...

  6. SpringBoot微服务电商项目开发实战 --- Redis缓存雪崩、缓存穿透、缓存击穿防范

    最近已经推出了好几篇SpringBoot+Dubbo+Redis+Kafka实现电商的文章,今天再次回到分布式微服务项目中来,在开始写今天的系列五文章之前,我先回顾下前面的内容. 系列(一):主要说了 ...

  7. mysql复制表结构和表数据

    我们知道,在SQL Server中,如果要复制表结构和表数据的话,可以使用select into语句. select * into yanggb1 from yanggb; 但是在MySQL中是不支持 ...

  8. web 自动化遇到 shadowDOM 节点你会操作吗?

    本文转载自: http://www.lemfix.com/topics/971 近期有同学在做web自动化的时候,发现页面上有些元素,在selenium中无法通过xpath来定位,各种原因找了半天,都 ...

  9. python-基础r/R、b、u/U含义

    1.r/R,代表非转义的原始字符串,一般使用在正则表达式和win目录上 2.b“” 代表b后面的内容为bytes类型 3.u/U 表示对字符串进行unicode编码,一般使用在有中午的地方,防止乱码.

  10. EF Core 中处理 1对1 关系

    最近在开发记录感想功能的时候用到了1对1的数据关系,具体情况是这样的,有这样两个1对1的类型 public class Item { public int Id { get; set; } publi ...