Můžete toho dosáhnout pomocí SSH Tunneling, kdy nastavíte vzdálenou instanci MongoDB tak, aby běžela na jednom z vašich místních portů. Ve výchozím nastavení běží MongoDB na 27017, takže v příkladu níže jsem se rozhodl namapovat vzdálenou instanci MongoDB na můj místní port 27018.
Pokud se pokoušíte zkopírovat databázi ze SERVER1 na LOCALHOST, můžete na svém LOCALHOST spustit tento příkaz:
ssh -L27018:localhost:27017 SERVER1
(Samozřejmě nahraďte SERVER1 svým skutečným serverem nebo aliasem ssh)
Tím se otevře připojení SSH k SERVER1, ale také se namapuje port 27018 na LOCALHOST na vzdálený port 27017 na SERVER1. Nezavírejte toto připojení SSH a nyní se zkuste připojit k MongoDB na vašem počítači localhost s portem 27018, například takto:
mongo --port 27018
Všimnete si, že toto jsou nyní data na SERVER1, kromě toho, že k nim přistupujete z místního počítače.
Jen normálně spouštím MongoDB:
mongo
(nebo mongo --port 27107
)
Bude to váš místní stroj.
Nyní, protože technicky máte (na vašem LOCALHOST, kde jste spustili tunel SSH):
- MongoDB (LOCALHOST) na 27017
- MongoDB (SERVER1) na 27018
Stačí použít db.copyDatabase()
funkce uvnitř MongoDB (LOCALHOST) pro kopírování dat.
Z LOCALHOST NA PORT 27017 (spuštěním v přímém přenosu VAŠE DATA VYPADÍTE)
// 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");
Měli byste být schopni toto vše zabalit do skriptu shellu, který dokáže všechny tyto příkazy provést za vás. Sám jeden mám, ale ve skutečnosti má pár kroků navíc, díky kterým by to asi bylo trochu matoucí :)
Když to uděláte a použijete nativní funkci db.copyDatabase() MongoDB, nebudete muset vypisovat/zipovat/obnovovat. Samozřejmě, pokud stále chcete jít touto cestou, nebylo by příliš těžké spustit mongodump
, exportujte data, tar/gzip je a poté použijte scp TARGETSERVER:/path/to/file /local/path/to/file
stáhněte jej a spusťte mongorestore
na to.
Jen to vypadá jako více práce!
Upravit - Zde je soubor SH a JS, které spolu tvoří skript shellu, se kterým to můžete spustit. Spusťte je na svém LOCALHOST , nespouštějte je naživo, jinak to udělá db.dropDatabase naživo. Vložte tyto dva soubory do stejné složky a nahraďte NÁZEV VÁŠHO SERVERU v pull-db.sh
s aliasem domain/ip/ssh a poté v pull-db.js
změňte DBNAMEHERE na jakýkoli název databáze.
Obvykle vytvářím složku s názvem scripts
v mých projektech a pomocí Textmate stačí stisknout ⌘+R
zatímco máte pull-db.sh
otevřít pro úpravy, aby bylo možné jej spustit.
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");
Přidal jsem do skriptu shellu nějaký extra kód, abych ozval, co to dělá (sorta). Časovače spánku ve skriptu mají pouze poskytnout připojení SSH čas na připojení před spuštěním dalšího řádku. V zásadě se stane toto:
- První řádek kódu vytvoří tunel na vašem počítači a odešle ECHO, SLEEP a EXIT do vzdálené relace SSH.
- Potom počká 5 sekund, což umožní připojení relace SSH v kroku 1.
- Potom převedeme soubor pull-db.js do místního mongo shellu. (Krok #1 by měl být proveden do 5 sekund...)
- Soubor pull-db.js by nyní měl běžet v mongo a terminál SSH v kroku č. 1 pravděpodobně běžel 10 sekund po otevření připojení a do jeho relace je odeslán příkaz EXIT. Příkaz je vydán, OVŠEM relace SSH ve skutečnosti zůstane otevřená, dokud nebude dokončena aktivita z kroku #3.
- Jakmile váš skript pull-db.js dokončí stahování všech vašich dat ze vzdáleného serveru, příkaz EXIT zadaný v kroku č. 1 na vzdáleném serveru může konečně ukončit připojení a zrušit vazbu 27108 na vašem localhost.
Nyní byste měli mít všechna data ze vzdálené databáze na vašem localhost.