2

我是 mongodb 的新手。我有一个本地服务器和一个远程服务器。mongodump使用/ tools将 mongo 数据库从本地服务器迁移到远程服务器mongorestore后,我发现远程服务器上的数据库大小变大了。

这是我的样本:

在本地服务器上(Ubuntu 14.04.2 LTS,mongo 3.0.5):

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

在远程服务器上(CentOS 6.7,mongo 2.4.3):

> show dbs
Daily_data      9.94921875GB
Monthly_data    0.953125GB
Weekly_data     3.9521484375GB

我还检查了一个要比较的集合的状态,计数相同,但大小(如indexSizetotalIndexSize等)发生了变化:

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

> 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/mongorestore是迁移 mongo 数据库的好方法?

4

2 回答 2

3

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

运行还原时,会重建索引,但要避免阻塞还原操作中发生的其他写入操作。这类似于文档中描述的在后台构建索引中使用的过程,不完全相同但很接近。

为了获得最佳的索引大小,最好先从目标数据库中删除索引,然后在命令中使用该--noIndexRestore选项,mongorestore因为这将防止在数据加载期间建立索引。

然后,完成后,您可以运行常规createIndex排除“背景”选项的任何用法,以便在前台创建索引。结果将是在创建索引期间数据库将被阻止读写,但生成的索引将具有较小的大小。

至于一般做法,您会注意到其他数据大小实际上会“更小”,因为在“重建”过程中,那么在恢复数据时不会创建源中存在的任何松弛空间。

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

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

于 2015-09-19T08:15:53.387 回答
1

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

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

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

于 2015-09-19T08:15:40.773 回答