为什么我的mongodb fileSize比db.stats()中的storageSize大得多?

 高桥惜员_136 发布于 2023-02-11 13:12

我有一个名为log_test1的数据库,只有1个上限的收集日志.封顶集合的最大大小为512M.插入200k数据后,我发现db的磁盘使用率为1.6G.使用db.stats(),我可以看到storageSize是512M,正确,但我的实际fileSize是1.6G,为什么会发生这种情况?如何控制磁盘大小只是我的上限集合大小加上索引大小?

> use log_test1
switched to db log_test1
> db.stats()
{
    "db" : "log_test1",
    "collections" : 3,
    "objects" : 200018,
    "avgObjSize" : 615.8577328040476,
    "dataSize" : 123182632,
    "storageSize" : 512008192,
    "numExtents" : 3,
    "indexes" : 8,
    "indexSize" : 71907920,
    "fileSize" : 1610612736,
    "nsSizeMB" : 16,
    "dataFileVersion" : {
        "major" : 4,
        "minor" : 5
    },
    "ok" : 1
}

Rafa.. 11

这可能是因为MongoDB预分配了数据和日志文件.


MongoDB 2

在数据目录中,MongoDB将数据文件预先分配到特定大小,部分是为了防止文件系统碎片.MongoDB命名第一个数据文件.0,下一个.1等等.第一个mongod分配的文件是64兆字节,接下来是128兆字节,依此类推,最多2千兆字节,此时所有后续文件都是2千兆字节.数据文件包含具有已分配空间但不保留数据的文件.mongod可能会分配一个可能90%为空的1千兆字节数据文件.对于大多数较大的数据库,与数据库相比,未使用的分配空间较小.

在类Unix系统上,mongod预先分配一个额外的数据文件并将磁盘空间初始化为0.在后台预分配数据文件可防止在下次分配新数据库文件时出现重大延迟.

您可以使用noprealloc运行时选项禁用预分配.然而noprealloc打算在生产环境中使用:只使用noprealloc用于测试和小数据集在这里你经常删除数据库.

MongoDB 3

数据目录中的数据文件(/data/db 默认配置中的目录)可能大于插入数据库的数据集.考虑以下可能的原因:

预分配的数据文件

MongoDB预先分配其数据文件以避免文件系统碎片,因此,这些文件的大小不一定反映数据的大小.

storage.mmapv1.smallFiles选项将减小这些文件的大小,如果磁盘上有许多小型数据库,这可能很有用.

oplog

如果此mongod是副本集的成员,则数据目录包括该oplog.rs文件,该文件是本地数据库中预分配的上限集合.

在64位安装上,默认分配大约是磁盘空间的5%.

日记

数据目录包含日志文件,它们在MongoDB将数据应用到数据库之前将写入操作存储在磁盘上.

空记录

MongoDB在删除文档和集合时维护数据文件中的空记录列表.MongoDB可以重用此空间,但默认情况下不会将此空间返回给操作系统.


取自MongoDB存储常见问题解答.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有