迁移后Mongodb数据文件变小

n0n*_*ker 5 mongodb mongorestore mongodump

在我的第一台服务器上我得到:

root@prod ~ # du -hs /var/lib/mongodb/
909G    /var/lib/mongodb/
Run Code Online (Sandbox Code Playgroud)

迁移数据库与mongodump/mongorestore在我的第二台服务器上,我得到:

root@prod ~ # du -hs /var/lib/mongodb/
30G /var/lib/mongodb/
Run Code Online (Sandbox Code Playgroud)

在我等了几个小时后,mongo完成索引我得到了:

root@prod ~ # du -hs /var/lib/mongodb/
54G /var/lib/mongodb/
Run Code Online (Sandbox Code Playgroud)

我测试了数据库,没有损坏或遗漏的数据.

为什么迁移前后的大小差异如此之大?

Joh*_*one 8

当实际数据大小因数据删除以及其他原因而丢失时,MongoDB无法恢复磁盘空间.在线文档中有一个不错的解释:

为什么我的数据目录中的文件大于数据库中的数据?

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

预分配的数据文件.

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

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

您可以通过将preallocDataFiles设置为false来禁用预分配.但是,不要为生产环境禁用preallocDataFiles:仅使用preallocDataFiles进行测试,并使用经常删除数据库的小数据集.

在Linux系统上,您可以使用hdparm来了解分配的成本:

time hdparm --fallocate $((1024*1024))testfile

oplog.

如果此mongod是副本集的成员,则数据目录包含oplog.rs文件,该文件是本地数据库中预分配的上限集合.默认分配大约是64位安装的磁盘空间的5%,有关详细信息,请参阅Oplog大小调整.在大多数情况下,您不需要调整oplog的大小.但是,如果这样做,请参阅更改Oplog的大小.

日记.

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

空记录.

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

要对分配的存储进行去片段化,请使用compact,它会对分配的空间进行分解.通过对存储进行分解,MongoDB可以有效地使用分配的空间.compact需要最多2 GB的额外磁盘空间才能运行.如果磁盘空间严重不足,请不要使用紧凑型.

重要

compact仅从MongoDB数据文件中删除碎片,并且不会向操作系统返回任何磁盘空间.

要回收已删除的空间,请使用repairDatabase,它会重建数据库,该数据库会对存储进行分解,并可能释放操作系统的空间.repairDatabase需要最多2千兆字节的额外磁盘空间才能运行.如果磁盘空间严重不足,请不要使用repairDatabase.

http://docs.mongodb.org/manual/faq/storage/

他们没有告诉你的是恢复/恢复磁盘空间的另外两种方法 - mongodump/mongorestore就像你所做的那样,或者将新成员添加到具有空磁盘的副本集中,以便从头开始编写databsae文件.

如果您对监视此问题感兴趣,db.stats()命令将返回有关数据,索引,存储和文件大小的大量数据:

http://docs.mongodb.org/manual/reference/command/dbStats/