专栏首页未闻Code一日一技:单机单节点 MongoDB 为什么删除数据后不释放空间?

一日一技:单机单节点 MongoDB 为什么删除数据后不释放空间?

摄影:产品经理

阳春面

MongoDB 3.6以后,默认使用的储存引擎是 WiredTiger。这个引擎有一个特点,就是删除数据不释放空间。例如现在你的一个集合里面有10000000条数据,占用10GB 的硬盘空间。你把其中的9999999条数据都删了,占用空间仍然是10GB。

如果你想释放空间,最直接的方法是删除整个集合(Drop Collection)或者删除整个数据库(Drop Database)。

如果你的 MongoDB 版本小于4.4,但是大于等于3.6,那么虽然删除了数据,磁盘空间不会释放,但当你插入新的数据时,MongoDB 会重用之前占有的空间,而不会继续额外占用新的磁盘空间。

例如你的集合有10GB,你删除了9999999条数据,接下来,在你新插入的数据总大小超过10GB 前,MongoDB 都不会申请额外的硬盘空间。

我们可以在 Robo 3T 上,通过查看集合的统计信息找到当前集合可重复使用的空间大小。在集合上右键,选择Statistics,从返回的统计数据中,展开wiredTiger-block-manager-file bytes available for reuse。这里显示的数据就是当前集合可重用的空间大小。如下图所示。

如果你的 MongoDB 允许暂停读写操作,那么还可以在 Robo 3T 或者 Mongo Shell 中使用compact命令来释放空间。命令格式为:

db.runCommand({'compact': '集合名'})

在 MongoDB 4.4之前的版本,compact会阻塞整个库的增删改查操作,所以需要暂停外部读写后才能执行。

在 MongoDB 4.4 或以后的版本,compact命令几乎可以在除了删除集合、增删索引外的任何时候执行。

关于 compact命令的更多说明,可以阅读compact — MongoDB Manual[1]。

参考资料

[1]

compact — MongoDB Manual: https://docs.mongodb.com/manual/reference/command/compact/#dbcmd.compact

本文分享自微信公众号 - 未闻Code(itskingname),作者:kingname

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-08-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 一日一技:为 git commit 设置默认模板

    当大量的提交都写着“update”的时候,你根本没法快速知道每个提交改的是什么内容——是修复了什么bug?是增强了什么功能?等时间久了,需要找以前的某一个提交检...

    青南
  • 使用有限状态机原理实现英文分词

    使用Python开发一个英文句子分词程序,把一段英文句子切分为每一个单词。不能导入任何官方的或者第三方的库,也不能使用字符串的split()方法。

    青南
  • 一日一技:MongoDB聚合查询匹配中文

    MongoDB的聚合查询中,$substr只能匹配ASCII的数据,对于中文要使用$substrCP

    青南
  • 避免 MongoDB 被勒索详解,腾讯云上更安全

    腾讯云安全
  • 概率论02 概率公理

    概率论早期用于研究赌博中的概率事件。赌徒对于结果的判断基于直觉,但高明的赌徒尝试从理性的角度来理解。然而,赌博中的一些结果似乎有矛盾。比如掷一个骰子,每个数字出...

    Vamei
  • python 基础知识第9讲:序列之集合

    此时运行会报错,因为集合不支持通过索引的方法取值,而如果想要通过索引的方式来取值的话,可以将其转成列表再取,方法如下:

    小海怪的互联网
  • 磊哥测评之MongoDB篇

    上期文章我们聊到了Redis,这期我们来说说另一个网红NoSQL数据库——MongoDB。 PS:其他历史测评请直接翻到文末~ 有这么一个介绍MongoDB的...

    腾讯云数据库 TencentDB
  • 斯坦福CS231N深度学习与计算机视觉第二弹:图像分类与KNN

    大数据文摘
  • JavaScript学习笔记031-本地存储0jsonp

    Mr. 柳上原
  • 【Kubernetes】通过ConfigMap修改容器的DNS

    业务容器需要在 A 集群解析 B 集群的容器,已知 B 集群的 Pod 如果重启后,IP 会变化,所以在 B 集群创建 StatefulSet,并且创建 Hea...

    runzhliu

扫码关注云+社区

领取腾讯云代金券