Можете да постигнете това с SSH Tunneling, като настроите вашия отдалечен екземпляр на MongoDB да работи на един от вашите локални портове. По подразбиране MongoDB работи на 27017, така че в примера по-долу избрах да съпоставям моята отдалечена инстанция на MongoDB към моя локален 27018 порт.
Ако се опитвате да копирате база данни от SERVER1 към LOCALHOST, можете да изпълните тази команда на вашия LOCALHOST:
ssh -L27018:localhost:27017 SERVER1
(Очевидно заменете SERVER1 с вашия действителен сървър или ssh псевдоним)
Това отваря SSH връзка към SERVER1, но също така картографира порта 27018 на LOCALHOST към отдалечения порт 27017 на SERVER1. Не затваряйте тази SSH връзка и сега опитайте да се свържете с MongoDB на вашата локална хост машина с порт 27018, така:
mongo --port 27018
Ще забележите, че това вече са данните на SERVER1, освен че осъществявате достъп до тях от локалната си машина.
Просто стартирате MongoDB нормално:
mongo
(или mongo --port 27107
)
Ще бъде вашата локална машина.
Сега, тъй като технически имате (на вашия LOCALHOST, където пуснахте SSH тунела):
- MongoDB (LOCALHOST) на 27017
- MongoDB (SERVER1) на 27018
Можете просто да използвате db.copyDatabase()
функция в MongoDB (LOCALHOST) за копиране на данни.
ОТ 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");
Трябва да можете да обвиете всичко това в скрипт на обвивка, който може да изпълни всички тези команди вместо вас. Аз самият имам такъв, но всъщност има няколко допълнителни стъпки, които вероятно биха го направили малко по-объркващо :)
Правейки това и използването на естествената функция db.copyDatabase() на MongoDB ще ви попречи да се налага да изхвърляте/ципирате/възстановявате. Разбира се, ако все пак искате да вървите по този път, няма да е трудно да стартирате mongodump
, експортирайте данните, tar/gzip ги, след това използвайте scp TARGETSERVER:/path/to/file /local/path/to/file
да го дръпнете надолу и да стартирате mongorestore
върху него.
Просто изглежда като повече работа!
Редактиране - Ето SH и JS файл, които вървят заедно, за да направят шел скрипт, с който можете да стартирате това. Изпълнете ги на вашия LOCALHOST , не ги стартирайте на живо или това ще направи db.dropDatabase на живо. Поставете тези два файла в една и съща папка и заменете YOURSERVERNAME в pull-db.sh
с псевдонима на домейн/ip/ssh и след това в pull-db.js
променете DBNAMEHERE на каквото и да е името на вашата база данни.
Обикновено създавам папка, наречена scripts
в моите проекти и използвайки Textmate, просто трябва да натисна ⌘+R
докато имате pull-db.sh
отворете за редактиране, за да го изпълните.
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");
Добавих малко допълнителен код към скрипта на shell, за да отразя това, което прави (по някакъв начин). Таймерите за заспиване в скрипта са само за да дадат време на SSH връзките да се свържат преди стартирането на следващия ред. По принцип ето какво се случва:
- Първият ред от кода създава тунела на вашата машина и изпраща ECHO, SLEEP, след това EXIT към отдалечената SSH сесия.
- След това изчаква 5 секунди, което позволява на SSH сесията в стъпка 1 да се свърже.
- След това пренасяме файла pull-db.js в локалната обвивка на mongo. (Стъпка №1 трябва да се направи в рамките на 5 секунди...)
- Pul-db.js трябва да работи в mongo сега и SSH терминалът в стъпка #1 вероятно е работил 10 секунди след отварянето на връзката и EXIT се изпраща към сесията му. Командата е издадена, ОБАЧЕ, SSH сесията всъщност ще остане отворена, докато дейността от Стъпка #3 не приключи.
- Веднага след като вашият pull-db.js скрипт завърши изтеглянето на всичките ви данни от отдалечения сървър, командата EXIT, издадена в стъпка #1 на отдалечения сървър, най-накрая получава разрешение да затвори връзката, като отменя 27108 на вашия локален хост.
Вече трябва да имате всички данни от вашата отдалечена база данни във вашия локален хост.