Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将数据库从一台MongoDB服务器复制到另一台?_Mongodb - Fatal编程技术网

如何将数据库从一台MongoDB服务器复制到另一台?

如何将数据库从一台MongoDB服务器复制到另一台?,mongodb,Mongodb,我在不同的服务器上有两个MongoDB,都以--auth开头。现在我想把数据库从一台服务器复制到另一台服务器 > mongo > use admin > db.copyDatabase("mydb","mydb","another_server") 它表明: { "errmsg" : "", "ok" : 0 } 以及: 似乎没有错误,但复制不成功。正确的命令是什么?如果您使用的是--auth,则需要在其中包含用户名/密码 此外,运行命令时,您必须位于“目标”服务器上 db

我在不同的服务器上有两个MongoDB,都以
--auth
开头。现在我想把数据库从一台服务器复制到另一台服务器

> mongo
> use admin
> db.copyDatabase("mydb","mydb","another_server")
它表明:

{ "errmsg" : "", "ok" : 0 }
以及:

似乎没有错误,但复制不成功。正确的命令是什么?

如果您使用的是--auth,则需要在其中包含用户名/密码

此外,运行命令时,您必须位于“目标”服务器上

db.copyDatabase(<from_db>, <to_db>, <from_hostname>, <username>, <password>);
db.copyDatabase(,);

如果所有这些都不起作用,您可能想尝试创建一个要复制的数据库的从机…

除了Justin Jenkins的答案之外,请记住,如果您没有将mongodb暴露于网络(仅限本地主机),您也可以使用ssh隧道

我使用屏幕在“任务”之间切换。为了方便起见,ssh隧道和mongo在单独的屏幕选项卡中执行

步骤1:创建一个隧道

ssh username@yourdomainOrIP -L 27018:localhost:27017
...Enter your password
步骤2:

mongo
use admin
db.copyDatabase(<fromdb>,<todb>,"localhost:27018",<username>,<password)
mongo
使用管理员

db.copyDatabase(,,“localhost:27018”,,从
Mongo
version
3.2
开始,您可以使用
mongodump/mongorestore

mongodump  --host <from_host> --db <from_db> --archive | mongorestore --host <to_host> --archive
mongodump--host--db--archive | mongorestore--host--archive
有关更多信息,请访问:

要使远程mongo可访问,您可以创建到它的ssh隧道:

创建到远程mongodb服务器的隧道,并通过端口27117将其隧道到本地客户端

ssh -fN -L 27117:localhost:27017 <remote_host> 
ssh-fN-L 27117:localhost:27017
在这种情况下,要在要还原到的本地计算机上运行的命令可以是:

mongodump  --port 27117 --db <from_db> --archive | mongorestore --archive
mongodump--端口27117--数据库--存档| mongorestore--存档

除了Mike Shauneu的答案之外,如果目标服务器上的数据库名称与源服务器上的数据库名称不同,则需要重写名称空间。结合身份验证,我使用
--uri
选项实现了这一点,该选项需要最新的mongo版本(>3.4.6):


下面是我从Ubuntu服务器复制到另一个Ubuntu服务器的工作,这两个服务器都运行MongoDB v4+:

  • 应在要还原数据库的服务器上执行以下命令:
  • [可选]您可以按以下方式检查已还原的数据库:

  • 检查列表中是否存在您的数据库。

    提到的用户名和密码是数据库而不是主机名PS:我犯了这个错误,因此提到它:)谢谢!这非常简单。就我的情况而言,我没有用户名或密码,因此我必须关闭这些参数。我是否可以将数据库复制到mongo的datafolder中?@eranotzap您可以关闭一个数据库,复制数据文件并将其传输到另一个服务器(您可能也希望先关闭该服务器)但在我看来,使用copyDatabase不仅简单得多(无需关机/文件复制/传输)。。。但它也更安全,因为它的工作原理更像是复制到从机。谢谢@JustinJenkins有时数据库非常大,我如何知道哪些文件属于哪个数据库?只是为了向那些以前从未创建过SSH隧道的人澄清一下这些说明:27018这里有一个未使用的任意本地端口。为确保不使用,请使用“lsof-ti:9000”。如果返回进程,请使用lsof查找未使用的端口。此答案中的第二个27017端口是mongo正在运行的端口,位于您从中复制的远程主机上。为了确保这是正确的,请登录到远程主机并使用“lsof-iTCP-sTCP:LISTEN | grep mongo”确认mongo正在该端口上运行。这实际上是一个聪明的技巧,将转储传输到还原。尽管它可以与小型dbs一起工作,否则您需要一个非常可靠的连接,任何断开的连接都会导致恢复失败。
    mongodump  --port 27117 --db <from_db> --archive | mongorestore --archive
    
    mongodump --uri="mongodb://$sourceUser:$sourcePwd@$sourceHost/$sourceDb" --gzip --archive | mongorestore --uri="mongodb://$targetUser:$targetPwd@$targetHost/$targetDb" --nsFrom="$sourceDb.*" --nsTo="$targetDb.*" --gzip --archive
    
       ssh -fN -L 27018:127.0.0.1:27017 <remote_host_ip>
    
       mongodump --port 27018 --db <remote_db_name> --username <remote_db_username> --password <remote_db_password> --archive | mongorestore --username <destination_db_username> --password <destination_db_password> --archive
    
       mongo --authenticationDatabase "admin" -u <destination_db_username> -p
    
       show dbs