【问题标题】:How do I copy a database from one MongoDB server to another?如何将数据库从一台 MongoDB 服务器复制到另一台?
【发布时间】:2011-03-31 03:51:45
【问题描述】:

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

> mongo
> use admin
> db.copyDatabase("mydb","mydb","another_server")

它显示:

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

还有:

> db.getLastError()
null

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

【问题讨论】:

    标签: mongodb


    【解决方案1】:

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

    当您运行命令时,您必须在“目标”服务器上。

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

    如果所有这些都不起作用,您可能想尝试一些方法,例如创建要复制的数据库的从属...

    【讨论】:

    • 提到的用户名和密码是用于数据库而不是主机名 PS:我犯了这个错误,因此提到它:)
    • 谢谢!那非常简单。就我而言,我没有用户名或密码,所以我不得不关闭这些参数。
    • 我不能以某种方式将数据库复制到 mongo 的数据文件夹中吗?
    • @eranotzap 您可以关闭一个数据库,复制数据文件并将它们传输到另一台服务器(您也可能想先关闭它),但在我看来,使用 copyDatabase 不仅容易得多(无需关闭/文件复制/传输)...但它也更安全,因为它更像复制到从属设备。
    • 获取WARNING: db.copyDatabase will only function with MongoDB 4.0 and below. See http://dochub.mongodb.org/core/4.2-copydb-clone
    【解决方案2】:

    Mongo 版本3.2 开始,您可以使用mongodump/mongorestore

    mongodump  --host <from_host> --db <from_db> --archive | mongorestore --host <to_host> --archive
    

    可以在以下位置找到更多信息:

    https://docs.mongodb.com/manual/reference/program/mongodump/ https://docs.mongodb.com/manual/reference/program/mongorestore/

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

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

    ssh -fN -L 27117:localhost:27017 <remote_host> 
    

    在这种情况下,在您要还原到的本地计算机上运行的命令可能是:

    mongodump  --port 27117 --db <from_db> --archive | mongorestore --archive
    

    【讨论】:

      【解决方案3】:

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

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

      第 1 步:创建隧道

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

      第二步:

      mongo
      use admin
      db.copyDatabase(<fromdb>,<todb>,"localhost:27018",<username>,<password)
      

      【讨论】:

      • 只是为了向那些以前从未创建过 SSH 隧道的人澄清一下这些说明:这里的 27018 是一个未使用的任意本地端口。为确保不使用它,请使用“lsof -ti:9000”。如果返回进程,请使用 lsof 查找未使用的端口。此答案中的第二个 27017 端口是 mongo 正在运行的端口,位于您从中复制的远程主机上。为确保这是正确的,请登录远程主机并确认 mongo 正在此端口上运行:“lsof -iTCP -sTCP:LISTEN | grep mongo”。
      【解决方案4】:

      除了Mike Shauneu 的回答,如果你在目标服务器上的数据库名称和源服务器上的不同,你需要重写命名空间。结合身份验证,我使用--uri 选项使其工作,这需要最近的 mongo 版本(>3.4.6):

      mongodump --uri="mongodb://$sourceUser:$sourcePwd@$sourceHost/$sourceDb" --gzip --archive | mongorestore --uri="mongodb://$targetUser:$targetPwd@$targetHost/$targetDb" --nsFrom="$sourceDb.*" --nsTo="$targetDb.*" --gzip --archive
      

      【讨论】:

        【解决方案5】:

        以下对我来说可以从 Ubuntu 服务器复制到另一个运行 MongoDB v4+ 的 Ubuntu 服务器:

        1. 应从要恢复数据库的服务器执行以下命令:
           ssh -fN -L 27018:127.0.0.1:27017 <remote_host_ip>
        
        1. 现在我们已将远程服务器数据库映射到本地服务器端口 27018。接下来,我们可以使用 MongoDB 的 mongodump/mongorestore 管道从远程服务器复制到目标服务器:
           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
        
        1. [可选] 您可以按以下方式检查恢复的数据库:
           mongo --authenticationDatabase "admin" -u <destination_db_username> -p
        
           show dbs
        

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

        【讨论】:

        • 这实际上是一个聪明的技巧,将转储管道传输到还原。虽然它适用于小型数据库,否则您需要非常稳固的连接,任何断开的连接都会导致恢复失败。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多