您可以使用 SSH 隧道来完成此操作,将远程 MongoDB 实例设置为在本地端口之一上运行。默认情况下,MongoDB 在 27017 上运行,因此在下面的示例中,我选择将远程 MongoDB 实例映射到本地 27018 端口。
如果您尝试将数据库从 SERVER1 复制到 LOCALHOST,则可以在 LOCALHOST 上运行此命令:
ssh -L27018:localhost:27017 SERVER1
(显然将 SERVER1 替换为您的实际服务器或 ssh 别名)
这会打开到 SERVER1 的 SSH 连接,但也会将 LOCALHOST 上的端口 27018 映射到 SERVER1 上的远程端口 27017。不要关闭该 SSH 连接,现在尝试使用端口 27018 连接到 localhost 机器上的 MongoDB,如下所示:
mongo --port 27018
您会注意到这现在是 SERVER1 上的数据,除非您是从本地计算机访问它。
正常运行MongoDB:
mongo
(或mongo --port 27107
)
将是您的本地机器。
现在,由于您在技术上拥有(在您的 LOCALHOST 上,您在其中运行 SSH 隧道):
- 27017 上的 MongoDB(本地主机)
- 27018 上的 MongoDB (SERVER1)
您可以只使用db.copyDatabase()
MongoDB (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");
您应该能够将这一切包装到一个 shell 脚本中,该脚本可以为您执行所有这些命令。我自己也有一个,但它实际上有一些额外的步骤,可能会让它更混乱:)
这样做,并使用 MongoDB 的本机 db.copyDatabase() 函数将防止您不得不转储/压缩/恢复。当然,如果你还想走那条路,跑起来也不是什么难事mongodump
,导出数据,tar/gzip,然后用scp TARGETSERVER:/path/to/file /local/path/to/file
拉下来运行amongorestore
就可以了。
只是似乎需要更多的工作!
编辑- 这是一个 SH 和 JS 文件,它们一起构成一个 shell 脚本,您可以使用它来运行它。在你的 LOCALHOST 上运行这些,不要在 live 上运行它们,否则它会在 live 上运行 db.dropDatabase。将这两个文件放在同一个文件夹中,并将YOURSERVERNAME替换pull-db.sh
为 domain/ip/ssh 别名,然后pull-db.js
将 DBNAMEHERE 更改为您的数据库名称。
我通常在我的项目中创建一个名为的文件夹scripts
,并使用 Textmate,我只需⌘+R
在pull-db.sh
打开编辑时点击即可执行它。
拉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
拉-db.js
use DBNAMEHERE;
db.dropDatabase();
use DBNAMEHERE;
db.copyDatabase("DBNAMEHERE","DBNAMEHERE","localhost:27018");
我在 shell 脚本中添加了一些额外的代码来回显它在做什么(排序)。脚本中的睡眠计时器只是为了让 SSH 连接有时间在下一行运行之前建立连接。基本上,会发生以下情况:
- 代码的第一行在您的机器上创建隧道,并将 ECHO、SLEEP 和 EXIT 发送到远程 SSH 会话。
- 然后等待 5 秒,这将允许步骤 1 中的 SSH 会话连接。
- 然后我们将 pull-db.js 文件通过管道传输到本地 mongo shell。(第 1 步应在 5 秒内完成……)
- pull-db.js 现在应该在 mongo 中运行,并且步骤#1 中的 SSH 终端在连接打开后可能已经运行了 10 秒,并且 EXIT 被发送到它的会话。发出命令,但是,SSH 会话实际上将保持打开状态,直到步骤 #3 中的活动完成。
- 一旦你的 pull-db.js 脚本完成从远程服务器中提取所有数据,在远程服务器上的步骤 #1 中发出的 EXIT 命令最终被允许关闭连接,解除本地主机上的 27108 绑定。
您现在应该在本地主机中拥有远程数据库中的所有数据。