来自stdin的Mongorestore

时间:2018-09-24 11:27:05

标签: mongodb docker mongodump mongorestore

有人能从stdin恢复mongodump吗?

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

mongodump --archive > file

但是参考文献从未解释过档案的格式,或如何还原档案。有人说您必须从stdin中注入它,但是由于没有证据表明它实际上是可能的,因此他们仍然是个谜。

事实上,我进行了以下尝试,但均未成功:

cat file | mongorestore
mongorestore -vvvvv --archive < file
mongorestore -vvvvv --archive=file

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

Failed: stream or file does not appear to be a mongodump archive

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

为什么需要使用--archive来stdout?

我的mongodb在docker内部。

我正在使用的选项现在在Docker内部创建备份文件 ,然后我使用docker cp命令将该文件复制到主机,所以我使用所需空间的两倍(在将其移出容器之前)。

不幸的是,泊坞窗没有从主机上挂载,而且我(尚未)无法重新启动它以添加选项。我一直在寻找一个快速的选择。

1 个答案:

答案 0 :(得分:0)

因此,根据MongoDB官方mongodump doc和mongorestore doc

  

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

因此实际上,您不必先进行mongodump归档然后再从中读取,只需像下面这样用管道输送mongodump和mongorestore即可:

mongodump --archive | mongorestore --archive --drop

但是,您可能会像我https://stackoverflow.com/a/56550768/3785901那样遇到另一个问题。

在我的情况下,我必须使用--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

祝你好运。