Cri*_*ing 24 ssh shell mongodb
与Mysql不同,我发现尝试同步MongoDB文件非常具有挑战性 -
它们无法通过管道传输,因为它们不会将数据发送到stdout
(如果我理解正确的话).
所以,我试图找到另一种方式,不涉及两个ssh调用.
需要做的是:
但是,这里的关键是不留下任何痕迹 -
我不希望压缩文件保留在远程机器中,
这通常需要我进行另一次ssh登录.
因此,将"将文件移动到归档文件"中的某些内容是理想的解决方案,
如果以后可以无缝地将其传送回本地计算机.
我意识到MongoDB有一种方法可以使用mongodump连接到服务器凭据,但是端口是关闭的atm,所以我需要SSH方法.BTW,欢迎任何其他想法.
由于这些问题似乎有点受欢迎,我想分享一个脚本,该脚本是从这些问题的答案和过去一年的其他资源(信用到期)共同演变而来的.
该脚本基本上管理来自/到远程服务器的同步,对于任何类型的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隧道的地方):
您可以使用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.把这两个文件放在同一个文件夹中,并替换YOURSERVERNAME在pull-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连接提供连接时间.基本上,这是发生的事情:
您现在应该在localhost中拥有远程数据库中的所有数据.
要完成 Jesta 很好的回答,如果你想做相反的事情(从本地数据库复制到远程数据库),你必须以另一种方式绑定端口,使用 -R 命令而不是 -L 命令:
ssh -R27018:localhost:27017 你的服务器名
现在,登录到远程服务器,您可以从本地数据库复制数据库:
蒙戈
> db.copyDatabase('test','test','localhost:27018')
| 归档时间: |
|
| 查看次数: |
14370 次 |
| 最近记录: |