Mongodump:无法识别的字段'snapshot'

我正在使用mongo工具中的mongodump命令来下载服务器的备份。然而,当我运行该命令时,命令返回"Unrecognized field 'snapshot'"。

完整的错误信息如下:

Failed: error reading collection: Failed to parse: { find: "data", skip: 0, snapshot: true, $readPreference: { mode: "secondaryPreferred" }, $db: "xxx" }. Unrecognized field 'snapshot'.

Mongodump --version 返回:

mongodump version: built-without-version-string
git version: built-without-git-spec
Go version: go1.7.3
   os: linux
   arch: amd64
   compiler: gc
OpenSSL version: OpenSSL 1.0.2g  1 Mar 2016

我可能需要降级我的版本?否则不确定接下来该怎么办...

1你们使用的操作系统和MongoDB服务器版本是什么?根据你们的mongodump --version输出来看,似乎是从源代码构建的工具,所以很难确定对应的MongoDB版本。如果可能的话,我建议下载官方的二进制文件。 - Stennie
4个回答

添加--forceTableScan

示例:

mongodump --forceTableScan -d database_name -o target_directory

http://aug2uag.blogspot.com/2018/08/mongoexport-unrecognized-field-snapshot.html


错误来自Mongo 4.0引入的快照功能(https://docs.mongodb.com/manual/reference/read-concern-snapshot/

如果您使用旧的Mongo客户端(<4.0)导出最新的MongoDB,您将会收到以下错误:

Unrecognized field 'snapshot'

使用"forceTableScan"将阻止快照功能激活,这样您就不会收到错误。


您在mongodump和mongoDB服务器之间确实存在版本差异(3.6与4.0)。您可以使用Docker来解决这个问题:
docker run --rm -v $(pwd):/workdir/ -w /workdir/ mongo:4.0 mongodump -h server -d $database --out /workdir/dump/

使用Docker,您可以使用精确的CLI工具版本,而无需进行安装。
您甚至可以在.bashrc中指定别名:
alias mongodump="docker run --rm -v $(pwd):/workdir/ -w /workdir/ mongo:4.0 mongodump"

注意:保存转储文件的文件夹需要具有写入权限,以便容器中的 mongodb 用户可以写入挂载卷。在运行上述命令之前,可以通过手动设置转储文件夹的权限来实现。

在上面的示例中,可以这样做:mkdir -m 777 dump。完成转储后,可以将权限修改回正常状态(例如,sudo chmod 755 dump)。


1我一直遇到错误 Failed: error dumping metadata: error creating directory for metadata file dump/{COLLECTION}: mkdir dump: permission denied。我尝试使用 -u 0-o /tmp/dump,但无法使其工作。最后,我启动了一个容器,运行了导出命令,然后将其从容器中复制出来。你认为在这个一行代码中我做错了什么地方吗? - thirdender
2你需要适当设置uid:docker run --rm -v $(pwd):/workdir/ -w /workdir/ -u $(id -u) mongo:4.0 mongodump ... - ltn100

我在CentOS上遇到了相同的问题,我的mongodb使用用户名和密码进行了身份验证。

enter image description here

我使用了以下命令:

mongodump --forceTableScan -h <mongo database where it is hosted> -u <username>  -d <databasename>  -o /<output directory>/

当提示时,输入mongodb密码。

默认情况下,当可用索引(例如,视图没有任何索引)时,mongodump在扫描集合时使用_id索引。使用--forceTableScan参数来指定mongodump在不使用_id索引的情况下扫描集合数据。

如需更多信息,请参考link


如果你从Mongo Atlas导出数据,这个应该可以工作。
mongodump --forceTableScan --uri "mongodb+srv://username:password@clusteraaa.xxxx.mongodb.net/db_name"  --out "backup-dir"