Du kan opnå dette med SSH Tunneling, ved at konfigurere din eksterne MongoDB-instans til at køre på en af dine lokale porte. Som standard kører MongoDB på 27017, så i eksemplet nedenfor har jeg valgt at kortlægge min eksterne MongoDB-instans til min lokale 27018-port.
Hvis du prøver at kopiere en database fra SERVER1 til LOCALHOST, kan du køre denne kommando på din LOCALHOST:
ssh -L27018:localhost:27017 SERVER1
(Erstat naturligvis SERVER1 med din faktiske server eller ssh-alias)
Dette åbner en SSH-forbindelse til SERVER1, men kortlægger også port 27018 på LOCALHOST til fjernport 27017 på SERVER1. Luk ikke den SSH-forbindelse, og prøv nu at oprette forbindelse til MongoDB på din lokale værtsmaskine med port 27018, som sådan:
mongo --port 27018
Du vil bemærke, at dette nu er dataene på SERVER1, bortset fra at du får adgang til dem fra din lokale maskine.
Bare kører MongoDB normalt:
mongo
(eller mongo --port 27107
)
Vil være din lokale maskine.
Nu, da du teknisk set har (på din LOCALHOST, hvor du kørte SSH-tunnelen):
- MongoDB (LOCALHOST) på 27017
- MongoDB (SERVER1) på 27018
Du kan bare bruge db.copyDatabase()
funktion inde i MongoDB (LOCALHOST) til at kopiere data.
FRA LOCALHOST ON PORT 27017 (Hvis du udfører på live vil DINE DATA DROPPE)
// 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");
Du burde være i stand til at pakke alt dette ind i et shell-script, der kan udføre alle disse kommandoer for dig. Jeg har selv en, men den har faktisk et par ekstra trin, der nok ville gøre det lidt mere forvirrende :)
Gør du dette og bruger MongoDB's indbyggede db.copyDatabase() funktion vil du forhindre dig i at skulle dumpe/zip/gendan. Selvfølgelig, hvis du stadig ønsker at gå den rute, ville det ikke være for svært at køre mongodump
, eksporter dataene, tar/gzip det, og brug derefter scp TARGETSERVER:/path/to/file /local/path/to/file
at trække den ned og køre en mongorestore
på den.
Det virker bare som mere arbejde!
Rediger - Her er en SH- og JS-fil, der går sammen for at lave et shell-script, du kan køre dette med. Kør disse på din LOCALHOST , lad være med at køre dem på live eller det vil gøre db.dropDatabase på live. Læg disse to filer i samme mappe, og erstat DIN SERVERNAVN i pull-db.sh
med domænet/ip/ssh-aliasset og derefter i pull-db.js
ændre DBNAMEHERE til, hvad end dit databasenavn er.
Jeg opretter normalt en mappe kaldet scripts
i mine projekter, og ved at bruge Textmate, skal jeg bare trykke ⌘+R
mens du har pull-db.sh
åben for at redigere for at udføre den.
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");
Jeg tilføjede noget ekstra kode til shell-scriptet for at genkende, hvad det laver (sorta). Sleep-timerne i scriptet er kun for at give SSH-forbindelserne tid til at blive forbundet, før den næste linje køres. Grundlæggende er det her, hvad der sker:
- Første linje i koden opretter tunnelen på din maskine og sender EKKO, SLEEP og derefter EXIT til den eksterne SSH-session.
- Den venter derefter 5 sekunder, hvilket gør det muligt for SSH-sessionen i trin 1 at oprette forbindelse.
- Så overfører vi pull-db.js-filen til den lokale mongo-shell. (Trin #1 skal udføres inden for 5 sek...)
- Pull-db.js skulle køre i mongo nu, og SSH-terminalen i trin #1 har sandsynligvis kørt i 10 sekunder efter dens forbindelse åbnede, og EXIT er sendt til dens session. Kommandoen udstedes, DOG vil SSH-sessionen faktisk forblive åben, indtil aktiviteten fra trin #3 er fuldført.
- Så snart dit pull-db.js-script er færdig med at trække alle dine data fra fjernserveren, får EXIT-kommandoen udstedt i trin #1 på fjernserveren endelig lov til at lukke forbindelsen og frigøre 27108 på din lokale vært.
Du skulle nu have alle data fra din fjerndatabase i din lokale vært.