问题描述
检查腾讯云数据库 MongoDB 实例的磁盘使用情况,如果磁盘使用率过高,则短时间内可能会写满磁盘,导致后续的数据无法写入,影响业务。
解决方案
1、建议对无效数据进行清理,释放空间。
一:使用db.dropDatabase()
与db.collection.drop()
指令删除对应的数据库和集合文件,该类指令执行后会立即释放空间。
二:使用db.collection.remove()
命令删除文件。
说明:执行db.collection.remove()
命令了删除文件,但是文件的物理空间不会被回收。如果执行remove命令删除了大量的文档,当新写入的数据大小满足碎片空间大小时,该碎片空间就会被重复利用,如果后续写入较小,可执行compact命令回收空闲的物理空间。
可以执行db.stats()
命令查看碎片整理前后数据库占用的磁盘空间。
预估campact操作能回收多少空间,可以通过下面命令进行查询:
代码语言:javascript复制 db.coll.stats().wiredTiger["block-manager"]["file bytes available for reuse"]
执行以下命令,对某个集合进行碎片整理。
代码语言:javascript复制db.runCommand({compact:"<collection_name>",force:true})
2、如果确认数据都需要保留,可以调整 MongoDB 实例规格,扩容云数据库的存储空间
注意事项
1、在调整配置过程中,如果本地宿主机磁盘空间不足以支持新扩容后的配置,可能会进行数据迁移,期间实例访问不受影响;迁移完成后会进行切换,会有秒级别闪断,请确保业务程序具备重连机制。
2、compact 一个集合,会加集合所在DB的互斥写锁,会导致该DB上所有的读写请求都阻塞;因为 compact 执行的时间可能很长,跟集合的数据量相关,所以强烈建议在业务低峰期执行,避免影响业务。