通过ssh同步MongoDB

Cri*_*ing 24 ssh shell mongodb

与Mysql不同,我发现尝试同步MongoDB文件非常具有挑战性 -
它们无法通过管道传输,因为它们不会将数据发送到stdout
(如果我理解正确的话).

所以,我试图找到另一种方式,不涉及两个ssh调用.
需要做的是:

  • 登录ssh服务器
  • 导出所有MongoDB文件
  • 将它们压缩为gzip
  • 将它们发送回本地计算机
  • 提取并导入

但是,这里的关键是不留下任何痕迹 -
我不希望压缩文件保留在远程机器中,
这通常需要我进行另一次ssh登录.
因此,将"将文件移动到归档文件"中的某些内容是理想的解决方案,
如果以后可以无缝地将其传送回本地计算机.

我意识到MongoDB有一种方法可以使用mongodump连接到服务器凭据,但是端口是关闭的atm,所以我需要SSH方法.BTW,欢迎任何其他想法.

编辑 - 11.06.14

由于这些问题似乎有点受欢迎,我想分享一个脚本,该脚本是从这些问题的答案和过去一年的其他资源(信用到期)共同演变而来的.
该脚本基本上管理来自/到远程服务器的同步,对于任何类型的db都可能(暂时可能是postgres,mysql和mongo).
它确实有一些假设,比如root用户没有db的密码,但可以根据需要进行更改.

该脚本可以在这里找到:https://github.com/iwfmp/zsh/blob/master/scripts/db/db-sync

Jes*_*sta 55

您可以使用SSH隧道完成此操作,将远程MongoDB实例设置为在您的一个本地端口上运行.默认情况下,MongoDB在27017上运行,因此在下面的示例中,我选择将远程MongoDB实例映射到本地27018端口.

如果您尝试将数据库从SERVER1复制到LOCALHOST,则可以在LOCALHOST上运行此命令:

ssh -L27018:localhost:27017 SERVER1

(显然将SERVER1替换为您的实际服务器或ssh别名)

这将打开与SERVER1的SSH连接,但也会将LOCALHOST上的端口27018映射到SERVER1上的远程端口27017.不要关闭SSH连接,现在尝试使用端口27018连接到本地主机上的MongoDB,如下所示:

mongo --port 27018

您会注意到这是SERVER1上的数据,除了您从本地计算机访问它.

只是正常运行MongoDB:

mongo(或mongo --port 27107)

将是你的本地机器.

现在,既然你在技术上拥有(在LOCALHOST上运行SSH隧道的地方):

  • MongoDB(LOCALHOST)在27017上
  • MongoDB(SERVER1)在27018上

您可以使用db.copyDatabase()MongoDB(LOCALHOST)中的函数来复制数据.

从LOCALHOST在港口27017(执行现场将丢弃您的数据)

// Use the right DB
use DATABASENAME; 
// Drop the Existing Data on LOCALHOST
db.dropDatabase();
// Copies the entire database from 27018
db.copyDatabase("DATABASENAME", "DATABASENAME", "localhost:27018");
Run Code Online (Sandbox Code Playgroud)

您应该能够将这些全部包装到可以为您执行所有这些命令的shell脚本中.我自己有一个,但它实际上有一些额外的步骤,可能会让它更混乱:)

这样做,并使用MongoDB的本机db.copyDatabase()函数将阻止您进行转储/ zip/restore.当然,如果你仍然想要走这条路,那么运行起来并不难mongodump,导出数据,tar/gzip,然后用scp TARGETSERVER:/path/to/file /local/path/to/file它来拉下它并运行mongorestore它.

看起来更像是工作!

编辑 - 这是一个SH和JS文件,它们共同构成一个shell脚本,你可以运行它.在LOCALHOST上运行它们,不要在实时运行它们,或者它将在live上执行db.dropDatabase.把这两个文件放在同一个文件夹中,并替换YOURSERVERNAMEpull-db.sh与域名/ IP/SSH的别名,然后在pull-db.js变化DBNAMEHERE到任何您的数据库名称为.

我通常创建一个文件夹,名为scripts在我的项目,并使用TextMate的,我只是打?+R,同时具有pull-db.sh开放,以执行它来编辑.

pull-db.sh

ssh -L27018:localhost:27017 YOURSERVERNAME '
    echo "Connected on Remote End, sleeping for 10"; 
    sleep 10; 
    exit' &
echo "Waiting 5 sec on local";
sleep 5;
echo "Connecting to Mongo and piping in script";
cat pull-db.js | mongo
Run Code Online (Sandbox Code Playgroud)

拉db.js

use DBNAMEHERE;
db.dropDatabase();
use DBNAMEHERE;
db.copyDatabase("DBNAMEHERE","DBNAMEHERE","localhost:27018");
Run Code Online (Sandbox Code Playgroud)

我在shell脚本中添加了一些额外的代码来回显它正在做的事情(sorta).脚本中的睡眠定时器只是为了在下一行运行之前为SSH连接提供连接时间.基本上,这是发生的事情:

  1. 代码的第一行在您的机器上创建隧道,并将ECHO,SLEEP,然后EXIT发送到远程SSH会话.
  2. 然后它等待5秒,这允许步骤1中的SSH会话连接.
  3. 然后我们将pull-db.js文件传递给本地mongo shell.(步骤#1应在5秒内完成......)
  4. pull-db.js现在应该在mongo中运行,并且步骤#1中的SSH终端可能在连接打开后运行10秒,并且EXIT被发送到它的会话.发出命令,但是,在第3步的活动完成之前,SSH会话将实际保持打开状态.
  5. 一旦pull-db.js脚本完成从远程服务器提取所有数据,最终允许远程服务器上步骤1中发出的EXIT命令关闭连接,取消绑定本地主机上的27108.

您现在应该在localhost中拥有远程数据库中的所有数据.

  • Er Mah Gerd,我爱你. (4认同)

Jul*_*nFr 6

要完成 Jesta 很好的回答,如果你想做相反的事情(从本地数据库复制到远程数据库),你必须以另一种方式绑定端口,使用 -R 命令而不是 -L 命令:

ssh -R27018:localhost:27017 你的服务器名

现在,登录到远程服务器,您可以从本地数据库复制数据库:

蒙戈

> db.copyDatabase('test','test','localhost:27018')