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. Django(一):url路由配置和模板渲染

    urls.py路由用法 url基本概念 url格式 urls.py的作用 url解析过程 include的作用 kwarg的作用 name的作用 URL概念 URL(Uniform Resoure L ...

  2. 导入做好的java项目出现下面的错误:The project cannot be built until build path errors are resolved

    例子:       作者在eclipse中导入一个新的项目时,出现了三个错误,如图1中所示: 图1 3 errors 原因分析:        在这个工程中,作者在写的时候,在build path中添 ...

  3. php使用phpqrcode生成二维码

    前期准备: 1.phpqrcode类文件下载,下载地址:https://sourceforge.net/projects/phpqrcode/2.PHP环境必须开启支持GD2扩展库支持(一般情况下都是 ...

  4. 数据库day01

    作业: 1. 查看岗位是teacher的员工姓名.年龄 select name,age from staff_info where jobs = 'teacher'; 查看岗位是teacher且年龄大 ...

  5. LeetCode刷题总结-树篇(上)

          引子:刷题的过程可能是枯燥的,但程序员们的日常确不乏趣味.分享一则LeetCode上名为<打家劫舍 |||>题目的评论: 如有兴趣可以从此题为起点,去LeetCode开启刷题之 ...

  6. FastJson中JSONString与各个对象的的转换关系及API示例

    前言 JSON作为一种轻量级的数据交换格式,在我们日常的开发中使用十分广泛,就Java后端的开发工作中,JSON字符串与Java对象之间相互转换是常常遇到的操作. 虽然平时用到的挺多的,但是因为用于J ...

  7. cesium 实现风场图效果(附源码下载)

    前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. 内 ...

  8. 《Hands-On System Programming with Go》之写文件的代码模板

    使用了buffer,这个神奇东东. var w io.WriteCloser // initialise writer defer w.Close() b := bufio.NewWriter(w) ...

  9. 关于使用DB2数据库的项目后台报-420错误码的问题

    ###  Error querying database.  Cause: com.ibm.db2.jcc.am.SqlDataException: DB2 SQL Error: SQLCODE=-4 ...

  10. 集合系列 Queue(十一):ArrayDeque

    从名字我们可以看出,其实一个双向队列实现,而且底层采用数组实现. public class ArrayDeque<E> extends AbstractCollection<E> ...