Sie können dies mit SSH-Tunneling erreichen, indem Sie Ihre Remote-MongoDB-Instance so einrichten, dass sie auf einem Ihrer lokalen Ports ausgeführt wird. Standardmäßig wird MongoDB auf 27017 ausgeführt, daher habe ich mich im folgenden Beispiel dafür entschieden, meine Remote-MongoDB-Instanz meinem lokalen 27018-Port zuzuordnen.
Wenn Sie versuchen, eine Datenbank von SERVER1 nach LOCALHOST zu kopieren, können Sie diesen Befehl auf Ihrem LOCALHOST ausführen:
ssh -L27018:localhost:27017 SERVER1
(Ersetzen Sie SERVER1 natürlich durch Ihren tatsächlichen Server- oder SSH-Alias)
Dies öffnet eine SSH-Verbindung zu SERVER1, ordnet aber auch den Port 27018 auf LOCALHOST dem Remote-Port 27017 auf SERVER1 zu. Schließen Sie diese SSH-Verbindung nicht und versuchen Sie jetzt, sich mit MongoDB auf Ihrem Localhost-Rechner mit Port 27018 zu verbinden, etwa so:
mongo --port 27018
Sie werden feststellen, dass dies jetzt die Daten auf SERVER1 sind, außer dass Sie von Ihrem lokalen Computer aus darauf zugreifen.
MongoDB einfach normal ausführen:
mongo
(oder mongo --port 27107
)
Wird Ihr lokaler Computer sein.
Nun, da Sie technisch gesehen haben (auf Ihrem LOCALHOST, wo Sie den SSH-Tunnel betrieben haben):
- MongoDB (LOCALHOST) auf 27017
- MongoDB (SERVER1) auf 27018
Sie können einfach db.copyDatabase()
verwenden Funktion innerhalb von MongoDB (LOCALHOST), um Daten zu kopieren.
VON LOCALHOST AUF PORT 27017 (Durch die Live-Ausführung werden IHRE DATEN VERLASSEN)
// 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");
Sie sollten in der Lage sein, dies alles in ein Shell-Skript zu packen, das alle diese Befehle für Sie ausführen kann. Ich habe selbst eins, aber es hat tatsächlich ein paar zusätzliche Schritte, die es wahrscheinlich etwas verwirrender machen würden :)
Wenn Sie dies tun und die native Funktion db.copyDatabase() von MongoDB verwenden, müssen Sie nicht dumpen/komprimieren/wiederherstellen. Wenn Sie diesen Weg trotzdem gehen möchten, wäre es natürlich nicht allzu schwer, mongodump
auszuführen , exportieren Sie die Daten, tar/gzip sie und verwenden Sie dann scp TARGETSERVER:/path/to/file /local/path/to/file
herunterziehen und einen mongorestore
ausführen drauf.
Scheint nur mehr Arbeit zu sein!
Bearbeiten - Hier ist eine SH- und JS-Datei, die zusammen ein Shell-Skript bilden, mit dem Sie dies ausführen können. Führen Sie diese auf Ihrem LOCALHOST aus , führen Sie sie nicht live aus, sonst wird die db.dropDatabase live ausgeführt. Legen Sie diese beiden Dateien in denselben Ordner und ersetzen Sie YOURSERVERNAME in pull-db.sh
mit dem Alias domain/ip/ssh und dann in pull-db.js
Ändern Sie DBNAMEHERE in Ihren Datenbanknamen.
Normalerweise erstelle ich einen Ordner namens scripts
In meinen Projekten und mit Textmate muss ich nur ⌘+R
drücken während Sie pull-db.sh
haben zum Bearbeiten öffnen, um es auszuführen.
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
pull-db.js
use DBNAMEHERE;
db.dropDatabase();
use DBNAMEHERE;
db.copyDatabase("DBNAMEHERE","DBNAMEHERE","localhost:27018");
Ich habe dem Shell-Skript zusätzlichen Code hinzugefügt, um anzuzeigen, was es tut (sorta). Die Sleep-Timer im Skript dienen nur dazu, den SSH-Verbindungen Zeit zu geben, eine Verbindung herzustellen, bevor die nächste Zeile ausgeführt wird. Im Grunde passiert Folgendes:
- Die erste Zeile des Codes erstellt den Tunnel auf Ihrem Rechner und sendet ECHO, SLEEP und dann EXIT an die entfernte SSH-Sitzung.
- Es wartet dann 5 Sekunden, wodurch die SSH-Sitzung in Schritt 1 eine Verbindung herstellen kann.
- Dann leiten wir die pull-db.js-Datei in die lokale Mongo-Shell. (Schritt #1 sollte innerhalb von 5 Sekunden erledigt werden...)
- Die pull-db.js sollte jetzt in Mongo laufen, und das SSH-Terminal in Schritt #1 ist wahrscheinlich 10 Sekunden lang gelaufen, nachdem seine Verbindung geöffnet wurde, und der EXIT wurde an seine Sitzung gesendet. Der Befehl wird ausgegeben, JEDOCH bleibt die SSH-Sitzung tatsächlich geöffnet, bis die Aktivität aus Schritt 3 abgeschlossen ist.
- Sobald Ihr Pull-db.js-Skript alle Ihre Daten vom Remote-Server abgerufen hat, darf der EXIT-Befehl, der in Schritt #1 auf dem Remote-Server ausgegeben wurde, endlich die Verbindung schließen und 27108 auf Ihrem Localhost lösen.
Sie sollten jetzt alle Daten aus Ihrer entfernten Datenbank in Ihrem localhost haben.