MongoDB磁盘空间占满,导致数据库被锁定,如何清理数据和磁盘空间

2024-04-24 22:44

本文主要是介绍MongoDB磁盘空间占满,导致数据库被锁定,如何清理数据和磁盘空间,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、问题

1、我在实际项目中,遇到一个问题,随着数据每天的不断增加,导致mongodb的磁盘空间站满了,数据库被锁了,无法使用。
2、故障表现
  • 部署的应用程序突然无法将数据写入数据库,但是可以正常读取数据。

  • 管理人员通过客户端连接数据库进行排查时,可以写入一条数据,返回错误信息:not authorized on xxxx to execute command

3、检查磁盘空间是否被耗尽

登录mongodb管理控制台,查看实例的状态,会发现已被锁定,并且磁盘空间占用已经100%

优化之前数据和磁盘情况:

二、解决方案

1、两种方案:

(1)通过变更配置方案,扩充磁盘空间,来提升实例的磁盘空间

(2)删除数据库中的数据,回收磁盘碎片以提升磁盘利用率,来减少数据存储空间,降低磁盘占用空间

我选择了第二种方案,因为我的数据库中,有很多非必要的数据可以删除,可以腾出不少磁盘空间。

2、注意问题

这里一定要注意,并不是在MongoDB实例数据库中删除数据,就能够释放MongoDB实例的磁盘空间。在删除云数据库MongoDB实例的数据后,这些被删除数据使用的存储空间会被标记为空闲,随后写入的新数据可能会被直接存储到这部分空闲的存储空间中,也可能会先扩展文件的存储空间再存储到文件末尾。上述情况将导致一部分空闲的存储空间不会被使用,这些未被使用的空闲存储空间被称之为磁盘碎片,磁盘碎片越多,磁盘利用率就越低。

3、背景信息

(1)执行db.runCommand({collStats: <collection_name>}) 命令访问节点时,返回结果有两个关键字:sizestorageSize。其中,size表示集合的逻辑存储大小,storageSize表示集合的物理存储大小。在执行remove命令删除文档后,size的值会减少,但是,storageSize的值不一定会减少。当storageSize大于size时,表示已产生磁盘碎片。

(2)compact是云数据库MongoDB的压缩命令,执行compact命令可以回收删除数据后产生的磁盘碎片,实现压缩磁盘空间的目的,从而提升磁盘利用率。

4、删除数据库数据

这里以表valueOpenData为例子,针对主节点,进行演示操作,之前已经清理了一部分表的磁盘空间,现已经不是100%。

删除数据,是不会减少磁盘空间的,这个一定要注意。

执行删除方案,删除某一段时间之前的数据:

db.valveOpenData.deleteMany({  "dataReadTime": {    "$lte": ISODate("2022-12-30T23:59:59Z")  }  
})
5、查看集合需回收的磁盘碎片空间

删除数据 清理磁盘之前的总磁盘占用情况

删除数据清理磁盘之前的磁盘占用空间

删除数据清理磁盘之前的数据库情况

执行查看集合需回收的磁盘碎片空间语句

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

结果:可清理磁盘碎片 9161187328 byte

6、回收单节点或副本集实例的磁盘碎片 


单节点实例只有一个StandAlone节点,您只需要连接主节点(Primary节点),执行compact命令回收主节点(Primary节点)的磁盘碎片。

副本集实例具有多个节点,您需要分别连接主节点(Primary节点)和从节点(Secondary节点),在不同节点上执行compact命令回收相应节点的磁盘碎片,执行的回收命令相同。

我这里回收的是主节点(Primary节点)磁盘碎片。

执行语句

db.runCommand({compact:"valveOpenData"})

强制执行语句

db.runCommand({compact:"valveOpenData",force:true})

执行成功的返回结果如下:{ "ok" : 1 }  ,清理磁盘空间完成,你也可以多执行几次清理

执行查看集合需回收的磁盘碎片空间语句

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

结果:清理过后磁盘碎片 1072041984 byte

删除数据清理磁盘之后的总磁盘占用情况

删除数据清理磁盘之后的磁盘占用空间

删除数据清理磁盘之后的数据库情况

最终结果:一个表删除数据、清理磁盘,清理出来差不多10G的磁盘空间

三、总结

对于不重要的数据,为了防止数据量过大,占满磁盘空间,需要定时清理过期或者不需要的数据。
最好写个定时器定时删除数据比较合适,但是要记得执行回收磁盘碎片空间,只有执行了回收后,才是真正回收了磁盘空间。

这篇关于MongoDB磁盘空间占满,导致数据库被锁定,如何清理数据和磁盘空间的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/933038

相关文章

Java注解之超越Javadoc的元数据利器详解

《Java注解之超越Javadoc的元数据利器详解》本文将深入探讨Java注解的定义、类型、内置注解、自定义注解、保留策略、实际应用场景及最佳实践,无论是初学者还是资深开发者,都能通过本文了解如何利用... 目录什么是注解?注解的类型内置注编程解自定义注解注解的保留策略实际用例最佳实践总结在 Java 编程

MySQL数据库约束深入详解

《MySQL数据库约束深入详解》:本文主要介绍MySQL数据库约束,在MySQL数据库中,约束是用来限制进入表中的数据类型的一种技术,通过使用约束,可以确保数据的准确性、完整性和可靠性,需要的朋友... 目录一、数据库约束的概念二、约束类型三、NOT NULL 非空约束四、DEFAULT 默认值约束五、UN

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

Pandas统计每行数据中的空值的方法示例

《Pandas统计每行数据中的空值的方法示例》处理缺失数据(NaN值)是一个非常常见的问题,本文主要介绍了Pandas统计每行数据中的空值的方法示例,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是空值?为什么要统计空值?准备工作创建示例数据统计每行空值数量进一步分析www.chinasem.cn处

如何使用 Python 读取 Excel 数据

《如何使用Python读取Excel数据》:本文主要介绍使用Python读取Excel数据的详细教程,通过pandas和openpyxl,你可以轻松读取Excel文件,并进行各种数据处理操... 目录使用 python 读取 Excel 数据的详细教程1. 安装必要的依赖2. 读取 Excel 文件3. 读