首页 > 数据库 >mongodb获取空闲磁盘空间

mongodb获取空闲磁盘空间

时间:2023-11-01 11:48:41浏览次数:43  
标签:freeStorageSize mongodb 占用 xxx db 磁盘空间 磁盘 空闲

这篇文章 mongodb使用内存和硬盘特性 我们介绍过mongodb删除数据后,并不会释放磁盘空间。大部分数据库为了性能都会这样做,比如mysql也是。不过mysql可以整理磁盘空间,把空闲的磁盘释放掉,还给操作系统,但是mongodb却不会。虽然说mongodb也有整理磁盘的接口调用(compact),但是它并不是释放所有的空闲空间,只是把很少的部分空间释放,继续可以忽略不计。并且compact时会锁表,导致数据库暂时不可用,也要谨慎使用。

如果磁盘空间不可以释放,如何维护mongodb的长时间稳定运行呢?实际上我们不需要mongodb把磁盘还给系统,只需要mongodb占用的磁盘大小一直维持在一个范围内即可(比如500G)。相当于mongodb一开始就划分了这么大的空间,后续不再增长,达到限额就把旧的数据覆盖即可。

要想实现mongodb对磁盘的占用维持在一个稳定的范围,定期删除数据是不可避免的。问题在与什么时候删除,删除多少数据呢?我们就需要知道当前mongodb到底占用了多少。虽然分配了500G,但是只占用了100G,所以不需要删除;如果占用空间快到500G了,我们就需要删除部分数据,因为超过500G后,mongodb就会分配新的磁盘,并且无法释放(除非导出数据库再导入)。

存储状态查询

mongodb官方提供了查看数据库或者集合状态的方法

db.stats()
db.xxx.stats()
db collections views objects avgObjSize dataSize storageSize indexes indexSize totalSize scaleFactor fsUsedSize fsTotalSize ok
xxx 152 0 256646 4953.99530481675 1271423079 477196288 308 14938112 492134400 1 1222409334784 1897374105600 1
ns size count avgObjSize numOrphanDocs storageSize freeStorageSize capped wiredTiger nindexes indexBuilds totalIndexSize totalSize indexSizes scaleFactor ok
xxx 215551960 6478 33274 0 59797504 1327104 false (Document) 15 Fields 2 (Array) 0 Elements 286720 60084224 (Document) 2 Fields 1 1

每个表示大小的单位取决于scaleFactor,基础都是字节,scaleFactor就是获取的字节数除以几,为了方便统计MB或者GB

  • db 数据库名

  • collections 数据库有多少集合

  • views 数据库有多少视图

  • objects 数据库有多少条数据

  • avgObjSize 每条就平均大小(字节)

  • dataSize 数据大小(字节),注意并不是磁盘占用大小,因为有压缩

  • storageSize 磁盘占用大小(数据)(字节)

  • indexes 索引数量

  • indexSize 索引磁盘占用大小(字节)

  • totalSize 全部磁盘占用大小(字节)(索引加数据)

  • scaleFactor 上面统计字节数再相除的除数,主要用作如果不想统计字节,可以设置为1024,就会自动除以1024,变成K,MB GB依此类推

  • fsUsedSize mongo占用的总的空间大小。不仅仅是数据库,包括mongo自身的bin文件和日志等

  • fsTotalSize mongo申请的总的磁盘大小。上面的只是用的到,有的磁盘空间已经申请了,但是还没用。

  • ns 集合名

  • size 记录在内存中未压缩的数据占用空间

  • count 数据条数

  • freeStorageSize 分配了磁盘空间,但是还未使用的大小(字节)

  • totalIndexSize 索引占用的大小(字节)

空闲状态查询

上面只是展示了占用了多少磁盘空间,mongodb提供的这两个查看数据库或者集合状态的api,可以传递参数,获取空闲可用的空间大小。

db.runCommand(
   {
     dbStats: 1,
     freeStorage: 1
   }
)
db	collections	views	objects	avgObjSize			dataSize	storageSize	freeStorageSize	indexes	indexSize	indexFreeStorageSize	totalSize	totalFreeStorageSize	scaleFactor	fsUsedSize		fsTotalSize		ok
xxx	152			0		249892	3916.97596161542	978820957	477196288	241803264		308		14921728	4743168					492118016	246546432				1			1222521229312	1897374105600	1

我们看到多了freeStorageSize indexFreeStorageSize totalFreeStorageSize,我们增加删除一下数据,看一下变化。

  db     collections	views	objects	avgObjSize			dataSize	storageSize	freeStorageSize	indexes	indexSize	indexFreeStorageSize	totalSize	totalFreeStorageSize	scaleFactor	fsUsedSize		fsTotalSize		ok
1 xxx	 152			0		249892	3916.97596161542	978820957	477196288	241803264		308		14921728	4743168					492118016	246546432				1			1222521229312	1897374105600	1
2 xxx	 152			0		249962	3918.08719725398	979372912	477196288	241803264		308		14921728	4743168					492118016	246546432				1			1222543265792	1897374105600	1
3 xxx	 152			0		249968	3917.99706762466	979373891	477196288	241688576		308		14921728	4734976					492118016	246423552				1			1222545735680	1897374105600	1
4 xxx	 152			0		247958	3747.61018398277	929249926	477196288	241688576		308		14938112	4743168					492134400	246431744				1			1222549508096	1897374105600	1
5 xxx	 152			0		247961	3747.56663749541	929250371	477196288	254107648		308		14921728	4784128					492118016	258891776				1			1222551937024	1897374105600	1

第1条是原始数据状态,第2条是增加了部分数据后直接查询的状态,我们看到objects增加了,从249892增加到249962,但是freeStorageSize并没有变,这是因为mongodb写入数据或者同步信息有延迟,这是正常的。又插入了几条数据,第3条再查询,就看到数据更新了,freeStorageSize indexFreeStorageSize totalFreeStorageSize都有增加。4和5是对数据删除,可以看到freeStorageSize indexFreeStorageSize totalFreeStorageSize也都有相应减少。

storageSize始终没有变换,就是因为mongodb还有空闲可用的空间,插入的时候也不会增加,删除也不会释放。

https://www.mongodb.com/docs/manual/faq/storage/#faq-disk-size
https://www.mongodb.com/docs/manual/reference/command/dbStats/#mongodb-dbcommand-dbcmd.dbStats
https://www.mongodb.com/docs/manual/reference/method/db.stats/
https://www.mongodb.com/docs/manual/reference/command/collStats/#mongodb-dbcommand-dbcmd.collStats
https://www.mongodb.com/docs/manual/reference/method/db.collection.stats/#mongodb-method-db.collection.stats

MongoServerError: scale has to be a number > 0

如果我们使用db.stats({scale: 1, freeStorage: 1})就会报上面的错误,按照官方的描述,好像这个实现还有问题。因为db.stats()是对db.runCommand({dbStats: 1})的封装,可能部分功能还没有实现,所以只能使用runCommand。

https://jira.mongodb.org/browse/MONGOSH-1108

标签:freeStorageSize,mongodb,占用,xxx,db,磁盘空间,磁盘,空闲
From: https://www.cnblogs.com/studywithallofyou/p/17802690.html

相关文章

  • Docker安装MongoDB 7.0.2
    拉取镜像dockerpullmongo使用docker安装mongodbdockerrun--restart=always--namemongodb-v~/docker/mongo:/data/db-d-p27017:27017-eMONGO_INITDB_ROOT_USERNAME=用户名-eMONGO_INITDB_ROOT_PASSWORD=密码mongo--auth--auth:需要密码才能访问容器服务......
  • 数据库信息速递 MongoDB 在开发者工具中集成了AI功能提高开发工作者的效率 (译)...
    MongoDB在6月份向其NoSQLAtlas数据库服务(DBaaS)添加向量搜索功能之后,MongoDB正在为一些工具添加新的生成式AI功能,来以进一步提高开发者的工作效率。这些新功能已经添加到MongoDB的关系迁移工具中如,Compass、AtlasCharts工具中。在文档接口中,MongoDB添加了一个由AI驱动的聊天机器人......
  • MongoDB 中的锁分析
    MongoDB中的锁前言MongoDB中锁的类型锁的让渡释放常见操作使用的锁类型如果定位MongoDB中锁操作1、查询运行超过20S的请求2、批量删除请求大于20s的请求3、kill掉特定client端ip的请求4、查询所有wait锁定的写操作5.返回索引的创建信息总结参考......
  • MongoDB 日志切割三种方式
    MongoDB日志切割​MongoDB默认是不会进行切割日志的,除非我们配置了logRotate=rename,并且重启MongoDB服务,才会进行切割日志的,那么为了避免实际中我们一个日志文件过大,我们需要对日志进行切割,有两个办法:1.通过MongoDB管理命令进行切割使用该命令时需要在MongoDB运行......
  • MongoDB常用脚本汇总
    概述本文汇总记录日常工作中常用的MongoDB查询脚本。实战新增新增集合:db.getSiblingDB("corpus").createCollection('message');删除删除一条数据:db.getSiblingDB("cx_user").userAccount.deleteOne({_id:ObjectId('628720aa454b9b0008ca218f')});批量删除多条数据:db.getSiblin......
  • MongoDB分片+副本集高可用集群的启停步骤
    ■■集群启动步骤1、先启动各节点的configservermongod-f${MongoDir}/conf/config.conf2、再启动各节点的shardservermongod-f${MongoDir}/conf/shard1.conf3、再启动各节点的mongosservermongos-f${MongoDir}/conf/mongos.conf■■集群停止步骤停止服务的......
  • 轻松掌握组件启动之MongoDB(番外篇):高可用复制集架构环境搭建-mtools
    引言在前两章节中,我们详细讲解了如何手动配置启动MongoDB。然而,现在有许多不同的工具可以帮助我们更方便地启动和创建MongoDB数据库。因此,今天我将介绍一个名为mtools的开源项目,它可以帮助我们更轻松地启动MongoDB。mtools介绍官方文档地址:mtoolsmtools是一个基于Python实现的......
  • MongoDB WiredTiger的读/写ticket
    在WiredTiger中,读/写ticket控制着并发性。也就是说,读/写ticket控制着有多少读写操作可以同时在存储引擎上执行。这是WiredTiger特有的设置,因此不会影响数据库中并发操作的数量。MongoDB有单独的机制来保存操作进度,可以退让给其他操作。 默认值读/写ticket的默认值都是128。这......
  • python链接mongodb的问题
    python链接mongodb需要指定数据库importpymongomonclient=pymongo.MongoClient("mongodb://用户名:密码@192.168.10.200:27017/数据库名")mondb=monclient["数据库名"]moncol=mondb["表名"]网上很多资料都没有指定数据库名,导致后续操作提示没有权限......
  • Docker安装Mongodb
    一、宿主机创建目录,存放mongodb配置信息、数据信息mkdir-p/usr/local/mymongo/conf二、参考官方配置文档,配置mongod.conf#在上面的conf目录下,创建mongod.confsystemLog:destination:filepath:/var/log/mongodb/mongod.loglogAppend:truestorage:dbPath:......