来自标准输入的 Mongorestore

Bib*_*elo 2 mongodb mongorestore mongodump docker

有人曾经设法从标准输入恢复 mongodump 吗?

我使用引用的命令生成了备份文件:

mongodump --archive > file
Run Code Online (Sandbox Code Playgroud)

但该参考资料从未解释存档的格式,或如何恢复它。有人说你必须从 stdin 注入它,但他们仍然是个谜,因为没有证据表明它实际上是可能的

事实上,我做了以下尝试,但没有成功:

cat file | mongorestore
mongorestore -vvvvv --archive < file
mongorestore -vvvvv --archive=file
Run Code Online (Sandbox Code Playgroud)

所有这些命令最终都会出现相同的错误:

Failed: stream or file does not appear to be a mongodump archive
Run Code Online (Sandbox Code Playgroud)

有关信息,我设法恢复了以经典方式生成的存档。

为什么我需要使用 --archive 到标准输出?

我的 mongodb 在 docker 里面。

我现在使用的选项在 docker创建备份文件,然后我使用 docker cp 命令将其复制到主机,因此我使用了所需空间的两倍(在它被删除到容器内之前)。

不幸的是,docker 没有来自主机的挂载,我无法(还)重新启动它以添加选项。我正在寻找一个快速的选择。

小智 6

所以根据 MongoDB 官方 mongodump doc和 mongorestore doc

要将转储输出到标准输出流以便通过管道传输到另一个进程,请使用存档选项运行 mongodump 但省略文件名。要从标准输入恢复,请使用 --archive 选项运行 mongorestore 但省略文件名。

所以实际上你不必先 mongodump 到文件然后从中读取,只需简单地管道 mongodump 和 mongorestore 像这样:

mongodump --archive | mongorestore --archive --drop
Run Code Online (Sandbox Code Playgroud)

但是,您可能会像我一样遇到另一个问题/sf/answers/3958553791/

就我而言,我必须使用 --nsFrom 和 --nsTo 而不是 --db,否则 mongorestore 无法按预期工作。所以我成功执行到 mongodump/mongorestore 的最终命令是:

mongodump --host HOST:PORT --db SOURCE_DB --username USERNAME --password PASSWORD --archive | mongorestore --host HOST:PORT --nsFrom 'SOURCE_DB.*' --nsTo 'TARGET_DB.*' --username USERNAME --password PASSWORD  --archive --drop
Run Code Online (Sandbox Code Playgroud)

祝你好运。