MongoDB 2.4不允许在fileSize〜= 2GB之后创建集合,但是dataSize〜1MB之后

时间:2018-08-03 03:00:15

标签: mongodb mmap

我在ARM处理器上使用的是MongoDB 2.4 32位。我正在数据库中创建动态集合。我遍历了MongoDB文档,该文档指出-存储引擎MMAP预先为文件系统分配了高达2GB的磁盘空间。 32-bit MongoDB processes are limited to about 2 gb of data

这是db.stats()的输出

{ 
    "db" : "admin", 
    "collections" : NumberInt(40), 
    "objects" : NumberInt(998), 
    "avgObjSize" : 196.9498997995992, 
    "dataSize" : NumberInt(196556), #~1MB
    "storageSize" : 1478905856.0, 
    "numExtents" : NumberInt(42), 
    "indexes" : NumberInt(50), 
    "indexSize" : NumberInt(433328), 
    "fileSize" : 2197028864.0, #2GB
    "nsSizeMB" : NumberInt(16), 
    "dataFileVersion" : {
    "major" : NumberInt(4), 
    "minor" : NumberInt(5)
    }, 
    "ok" : 1.0
}

在这里您可以看到数据大小为1MB,但文件大小为〜= 2GB。达到2GB的文件大小限制后,不允许我创建新集合。

du -sh /data/db
2.1G    /data/db/

当我尝试使用--repairpath选项修复数据库时,仍然显示错误

mongod --repair --repairpath /data/db2

错误

[initandlisten] ERROR:   mmap() failed for /data/db/admin.7 len:536608768 errno:12 Cannot allocate memory
[initandlisten] ERROR: mmap failed with out of memory. You are using a 32-bit build and probably need to upgrade to 64

[initandlisten] ERROR:   mmap() failed for /data/db2/_tmp_repairDatabase_0/admin.2 len:134217728 errno:12 Cannot allocate memory
[initandlisten] ERROR: mmap failed with out of memory. You are using a 32-bit build and probably need to upgrade to 64
[initandlisten] exception in initAndListen: 10084 can't map file memory - mongo requires 64 bit build for larger datasets, terminating
dbexit: 

有关如何解决此问题的任何建议,

1 个答案:

答案 0 :(得分:0)

我终于找到了这个问题的根本原因,其中fileSize为〜= 2GB,dataSize为几MB,及其解决方法。

根本原因- 如果数据库使用上限收集,则Mongodb 2.4 MMAP存储引擎将为这些上限收集分配固定数量的磁盘空间。在达到数据文件大小之后,任何尝试创建新集合的尝试都会导致Mongodb 2.4引发错误。

cant map file memory-mongo requires 64 bit build for larger datasets

就我而言,我是在动态创建上限集合。

解决方案- 使用mongod命令修复数据库的任何操作都将失败,因为它需要额外的内存才能执行这些操作。
因此,使用mongodump--repair一起获取数据库转储,这将为所有有上限的集合创建一个没有“上限”限制的转储,然后mongorestore

第1步-Take the dump of database alongwith --repair

mongodump --username <username> --password <password> --dbpath <path> --db <db> --out <path> --repair

第2步-Drop database

db.dropDatabase()

第3步-Restore the dump

mongorestore --username <username> --password <password> --dbpath <path> --db <db> <path>

第4步-Convert a Collection to Capped(Optional)

db.runCommand({"convertToCapped": "mycoll", size: 100000});

希望这会有所帮助。

欢呼