我正在使用这样的命令从远程计算机中转储数据:
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
答案 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"