云数据库MongoDB版清理oplog日志和compact命令详解
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 条件。
- 前面80%的空间里,是否有20%的空闲空间,用于写入文件后面20%的数据,或者
- 前面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命令详解的更多相关文章
- 云数据库 MongoDB版
阿里云云数据库MongoDB版是一种安全可靠.可弹性伸缩的云数据库服务,目前支持ReplicaSet和Sharding两种部署架构,通过简单的几步操作即可快速部署.阿里云云数据库MongoDB版是一种 ...
- 什么是云数据库 HBase 版
云数据库 HBase 版(ApsaraDB for HBase)是基于 Hadoop 的一个分布式数据库,支持海量的PB级的大数据存储,适用于高吞吐的随机读写的场景.目前在阿里内部有数百个集群,100 ...
- 公网访问阿里云数据库MongoDB——填坑日记
业务情景 两台服务器,一台阿里云ECS云服务器(专用网络),另一台是阿里云数据库MongoDB,处于安全考虑MongoDB是不运行外网连接的,那接下来就看怎么实现公网访问. 看到上面红色的网络类型描述 ...
- 云数据库Redis版256M双机热备款
云数据库Redis版是兼容Redis协议标准的.提供持久化的缓存式数据库服务,基于高可靠双机热备架构:全新推出的256M小规格款,适用于高QPS.小数据量业务,并支持免费全量迁移,完美服务于个人开发者 ...
- 阿里云数据库MySQL版快速上手!
MySQL是全球最受欢迎的开源数据库,其在各Web应用中均有广泛部署.阿里云数据库MySQL版基于Alibaba的MySQL源码分支,经过双11高并发.大数据量的考验,拥有优良的性能和吞吐量.除此之外 ...
- 云数据库 Redis 版,知识点
资料 网址 什么是云数据库Redis版 https://help.aliyun.com/document_detail/26342.html?spm=a2c4g.11174283.6.542.6b11 ...
- 云数据库 MariaDB 版
基于MariaDB企业版全球独家合作认证,提供Oracle兼容性及众多企业级数据库特性.支持包括MySQL InnoDB等多种存储引擎,为不同需求的用户提供灵活的选择. 请看视频简介 优势 Oracl ...
- 云数据库 Redis 版
首先观看视频简介 云数据库 Redis 版是一项易于部署和管理的按需数据库服务,与 Redis 协议兼容.云数据库 Redis 版通过从内存缓存中检索数据而提供高速数据读写功能,并通过同时使用内存和硬 ...
- 选择阿里云数据库HBase版十大理由
根据Gartner的预计,全球非关系型数据库(NoSQL)在2020~2022预计保持在30%左右高速增长,远高于数据库整体市场. 阿里云数据库HBase版也是踏着技术发展的节奏,伴随着NoSQL和大 ...
随机推荐
- Django(一):url路由配置和模板渲染
urls.py路由用法 url基本概念 url格式 urls.py的作用 url解析过程 include的作用 kwarg的作用 name的作用 URL概念 URL(Uniform Resoure L ...
- 导入做好的java项目出现下面的错误:The project cannot be built until build path errors are resolved
例子: 作者在eclipse中导入一个新的项目时,出现了三个错误,如图1中所示: 图1 3 errors 原因分析: 在这个工程中,作者在写的时候,在build path中添 ...
- php使用phpqrcode生成二维码
前期准备: 1.phpqrcode类文件下载,下载地址:https://sourceforge.net/projects/phpqrcode/2.PHP环境必须开启支持GD2扩展库支持(一般情况下都是 ...
- 数据库day01
作业: 1. 查看岗位是teacher的员工姓名.年龄 select name,age from staff_info where jobs = 'teacher'; 查看岗位是teacher且年龄大 ...
- LeetCode刷题总结-树篇(上)
引子:刷题的过程可能是枯燥的,但程序员们的日常确不乏趣味.分享一则LeetCode上名为<打家劫舍 |||>题目的评论: 如有兴趣可以从此题为起点,去LeetCode开启刷题之 ...
- FastJson中JSONString与各个对象的的转换关系及API示例
前言 JSON作为一种轻量级的数据交换格式,在我们日常的开发中使用十分广泛,就Java后端的开发工作中,JSON字符串与Java对象之间相互转换是常常遇到的操作. 虽然平时用到的挺多的,但是因为用于J ...
- cesium 实现风场图效果(附源码下载)
前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. 内 ...
- 《Hands-On System Programming with Go》之写文件的代码模板
使用了buffer,这个神奇东东. var w io.WriteCloser // initialise writer defer w.Close() b := bufio.NewWriter(w) ...
- 关于使用DB2数据库的项目后台报-420错误码的问题
### Error querying database. Cause: com.ibm.db2.jcc.am.SqlDataException: DB2 SQL Error: SQLCODE=-4 ...
- 集合系列 Queue(十一):ArrayDeque
从名字我们可以看出,其实一个双向队列实现,而且底层采用数组实现. public class ArrayDeque<E> extends AbstractCollection<E> ...