mongodump的收集比ram大

时间:2019-04-23 01:22:42

标签: mongodb mongodump

我正在使用这样的命令从远程计算机中转储数据:

mongodump --verbose \
          --uri="mongodb://mongousr:somepassword@host.domain.com:27017/somedb?authSource=admin" \
          --out="$BACKUP_PATH"

这样失败:

Failed: error writing data for collection `somedb.someCollection` to disk: error reading collection: EOF

somedb.someCollection约为40GB。我没有能力将RAM增加到这个大小。

我已经看到两种解释。一种是控制台输出太冗长,并占用了RAM。这似乎很荒谬,只有几千字节,而且还是在客户端计算机上。已拒绝(但为了确定,我现在再次尝试使用--quiet)。

更合理的解释是主机将somedb.someCollection数据填充到其RAM中,然后发生故障。问题是我见过的“解决方案”是将RAM增加到大于集合的大小。

真的吗?那是不对的。有此限制的mongodump有什么意义?

问题:是否可以mongodump具有大于我的RAM大小的集合的数据库?怎么样?

mongodump客户端:

macOS
mongodump --version
mongodump version: 4.0.3
git version: homebrew
Go version: go1.11.4
   os: darwin
   arch: amd64
   compiler: gc
OpenSSL version: OpenSSL 1.0.2r  26 Feb 2019

服务器:

built with docker FROM mongo:
Reports: MongoDB server version: 4.0.8

3 个答案:

答案 0 :(得分:1)

只需逐片转储您的收藏集:

mongodump --verbose \
          --uri="mongodb://mongousr:somepassword@host.domain.com:27017/somedb?authSource=admin" \
          --out="$BACKUP_PATH" -q '{_id: {$gte: ObjectId("40ad7bce1a3e827d690385ec")}}'

mongodump --verbose \
          --uri="mongodb://mongousr:somepassword@host.domain.com:27017/somedb?authSource=admin" \
          --out="$BACKUP_PATH" -q '{_id: {$lt: ObjectId("40ad7bce1a3e827d690385ec")}}'

或通过对_id或其他不同字段设置的其他查询对转储进行分区。报告的_id仅是示例。

答案 1 :(得分:1)

Stennie的答案确实有效。

storage.wiredTiger.engineConfig.cacheSizeGB的默认值为max((RAM-1GB)/2, 256MB)。如果您的mongodb服务器在具有默认配置的docker容器中运行,并且主机中正在运行其他应用程序,则在转储大型集合时内存可能已满。如果容器的RAM由于您的配置而受到限制,也会发生同样的事情。

您可以使用docker run --name some-mongo -d mongo --wiredTigerCacheSizeGB 1.5(数字取决于您的情况)。

答案 2 :(得分:0)

另一种可能性是将compress标志添加到mongodump的输出中。它帮助我备份了一个挂在48%而不压缩的数据库。因此语法为:

mongodump --uri="mongodb://mongousr:somepassword@host.domain.com:27017/somedbauthSource=admin"  --gzip --out="$BACKUP_PATH"