无法弄清楚移植后mongo数据库变大的原因?

时间:2015-09-19 06:40:55

标签: mongodb database-migration mongodump mongorestore

我是mongodb的新手。我有一个本地服务器和一个远程服务器。使用you need to have the functionality of this line var theoutput = thechange + thepurehtml; / mongodump工具将mongo数据库从本地服务器迁移到远程服务器后,我发现远程服务器上的数据库大小变大了。

这是我的样本:

本地服务器上的

(Ubuntu 14.04.2 LTS,mongo 3.0.5):

mongorestore
远程服务器上的

(CentOS 6.7,mongo 2.4.3):

> show dbs
Daily_data      7.9501953125GB
Monthly_data    0.453125GB
Weekly_data     1.953125GB

我还检查了一个要比较的集合的状态,计数是相同的但是大小(如> show dbs Daily_data 9.94921875GB Monthly_data 0.953125GB Weekly_data 3.9521484375GB indexSize等)已经改变:

这是本地服务器上的集合状态:

totalIndexSize

这是远程服务器上的集合状态:

> db.original_prices.stats()
{
    "ns" : "Daily_data.original_prices",
    "count" : 9430984,
    "size" : 2263436160,
    "avgObjSize" : 240,
    "numExtents" : 21,
    "storageSize" : 2897301504,
    "lastExtentSize" : 756662272,
    "paddingFactor" : 1,
    "paddingFactorNote" : "paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.",
    "userFlags" : 1,
    "capped" : false,
    "nindexes" : 2,
    "indexDetails" : {

    },
    "totalIndexSize" : 627777808,
    "indexSizes" : {
        "_id_" : 275498496,
        "symbol_1_dateTime_1" : 352279312
    },
    "ok" : 1
}

如果> db.original_prices.stats() { "ns" : "Daily_data.original_prices", "count" : 9430984, "size" : 1810748976, "avgObjSize" : 192.00000508960676, "storageSize" : 2370023424, "numExtents" : 19, "nindexes" : 2, "lastExtentSize" : 622702592, "paddingFactor" : 1, "systemFlags" : 1, "userFlags" : 0, "totalIndexSize" : 639804704, "indexSizes" : { "_id_" : 305994976, "symbol_1_dateTime_1" : 333809728 }, "ok" : 1 } / mongodump是迁移mongo数据库的好方法吗?

2 个答案:

答案 0 :(得分:3)

这里你似乎已经注意到的问题是索引清楚地表明它是indexSize已经在这里增长,并且有一个完美的逻辑解释。

运行还原时,将重建索引,但这样可以避免阻止还原操作中发生的其他写入操作。这与文档中描述的Build Indexes in the Background中使用的过程类似,不完全相同但接近。

为了获得最佳索引大小,最好首先从目标数据库中删除索引,并使用mongorestore选项和mongodump命令,因为这样可以防止在数据加载期间构建索引

然后,当完成后,您可以运行常规--noIndexRestore,排除使用"背景"选项,以便在前台创建索引。结果是在创建索引期间将阻止数据库进行读写,但结果索引的大小将会更小。

至于一般做法,你会注意到其他数据大小实际上会出现"更小"就像在重建过程中一样#34;然后,在恢复数据时,不会创建源中存在的任何松弛空间。

来自mongoexport的数据采用二进制格式,并且应该始终优先使用mongoimport和相关s1的文本格式,当然从一个MongoDB实例获取数据时并且在另一个上使用,因为那不是那些工具的目的。

其他替代文件系统副本,例如LVM快照,当然会恢复与备份副本完全相同的状态。

答案 1 :(得分:1)

可能影响集合磁盘大小的因素包括底层硬件,文件系统和配置。在您的情况下,主要因素似乎是本地和远程服务器上使用的存储引擎的差异:当远程运行旧版本时,本地服务器正在运行Mongo 3.0。这基于paddingFactorNote属性的存在是显而易见的,但您可以通过在两种环境中运行db.version()来确认。

在Mongo 2.4 / 2.6和Mongo 3.0之间,对集合的存储方式进行了几项重要更改,尤其是添加了WiredTiger存储引擎作为默认mmapv1存储引擎的替代方案。 mmapv1引擎(您使用的)在分配期间如何填充文档以适应文档大小的增长也发生了变化。

尺寸差异的另一个主要原因来自您使用mongorestore。在正常使用期间,mongo数据库不会以最小化磁盘使用的方式存储。但是,mongorestore以紧凑的方式重建数据库/集合,这就是为什么对于您发布的集合,远程storageSize更小。