Możesz to osiągnąć za pomocą tunelowania SSH, konfigurując zdalną instancję MongoDB tak, aby działała na jednym z portów lokalnych. Domyślnie MongoDB działa na 27017, więc w poniższym przykładzie wybrałem mapowanie mojej zdalnej instancji MongoDB na mój lokalny port 27018.
Jeśli próbujesz skopiować bazę danych z SERWERA1 do LOCALHOST, możesz uruchomić to polecenie na LOCALHOST:
ssh -L27018:localhost:27017 SERVER1
(Oczywiście zastąp SERWER1 swoim rzeczywistym serwerem lub aliasem ssh)
Spowoduje to otwarcie połączenia SSH z serwerem SERVER1, ale także mapuje port 27018 na LOCALHOST na zdalny port 27017 na serwerze SERVER1. Nie zamykaj tego połączenia SSH, a teraz spróbuj połączyć się z MongoDB na komputerze lokalnym z portem 27018, w ten sposób:
mongo --port 27018
Zauważysz, że teraz są to dane na serwerze SERVER1, z wyjątkiem tego, że uzyskujesz do nich dostęp z komputera lokalnego.
Po prostu normalnie działa MongoDB:
mongo
(lub mongo --port 27107
)
Będzie twoją lokalną maszyną.
Teraz, ponieważ technicznie masz (na swoim LOCALHOST, gdzie uruchomiłeś tunel SSH):
- MongoDB (LOCALHOST) na 27017
- MongoDB (SERWER1) na 27018
Możesz po prostu użyć db.copyDatabase()
funkcja wewnątrz MongoDB (LOCALHOST) do kopiowania danych.
Z LOCALHOST NA PORTU 27017 (wykonywanie na żywo spowoduje UPUSZCZENIE TWOICH DANE)
// 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");
Powinieneś być w stanie zamknąć to wszystko w skrypcie powłoki, który może wykonać wszystkie te polecenia za ciebie. Sam mam taki, ale w rzeczywistości ma kilka dodatkowych kroków, które prawdopodobnie sprawiłyby, że byłoby trochę bardziej zagmatwane :)
Wykonanie tego i użycie natywnej funkcji db.copyDatabase() MongoDB zapobiegnie konieczności zrzutu/zipu/przywrócenia. Oczywiście, jeśli nadal chcesz iść tą drogą, uruchomienie mongodump
nie będzie zbyt trudne , wyeksportuj dane, tar/gzip je, a następnie użyj scp TARGETSERVER:/path/to/file /local/path/to/file
ściągnąć go i uruchomić mongorestore
na nim.
Po prostu wydaje się, że to więcej pracy!
Edytuj - Oto plik SH i JS, które razem tworzą skrypt powłoki, z którym można to uruchomić. Uruchom je na swoim LOCALHOST , nie uruchamiaj ich na żywo lub zrobi to db.dropDatabase na żywo. Umieść te dwa pliki w tym samym folderze i zastąp NAZWA SERWERA w pull-db.sh
z aliasem domain/ip/ssh, a następnie w pull-db.js
zmień DBNAMEHERE na dowolną nazwę bazy danych.
Zwykle tworzę folder o nazwie scripts
w moich projektach i używając Textmate, wystarczy nacisnąć ⌘+R
mając pull-db.sh
otwórz do edycji, aby go wykonać.
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");
Dodałem dodatkowy kod do skryptu powłoki, aby powtórzyć to, co robi (sorta). Zegary uśpienia w skrypcie mają po prostu dać połączeniom SSH czas na połączenie przed uruchomieniem następnej linii. Zasadniczo dzieje się tak:
- Pierwszy wiersz kodu tworzy tunel na twoim komputerze i wysyła ECHO, SLEEP, a następnie EXIT do zdalnej sesji SSH.
- Następnie czeka 5 sekund, co pozwala na połączenie sesji SSH w kroku 1.
- Następnie przesyłamy plik pull-db.js do lokalnej powłoki mongo. (Krok nr 1 należy wykonać w ciągu 5 sekund...)
- Pull-db.js powinien teraz działać w mongo, a terminal SSH w kroku #1 prawdopodobnie działał przez 10 sekund po otwarciu połączenia, a EXIT jest wysyłany do jego sesji. Wydano polecenie, JEDNAK sesja SSH pozostanie otwarta do czasu zakończenia czynności z kroku 3.
- Gdy tylko skrypt pull-db.js zakończy ściąganie wszystkich danych ze zdalnego serwera, polecenie EXIT wydane w kroku #1 na zdalnym serwerze może w końcu zamknąć połączenie, rozłączając powiązanie 27108 na lokalnym hoście.
Powinieneś teraz mieć wszystkie dane ze zdalnej bazy danych na swoim lokalnym hoście.