आप इसे SSH टनलिंग के साथ पूरा कर सकते हैं, अपने एक स्थानीय पोर्ट पर चलने के लिए अपने दूरस्थ MongoDB इंस्टेंस को सेट कर सकते हैं। डिफ़ॉल्ट रूप से, MongoDB 27017 पर चलता है, इसलिए नीचे दिए गए उदाहरण में, मैंने अपने दूरस्थ MongoDB उदाहरण को अपने स्थानीय 27018 पोर्ट पर मैप करना चुना है।
यदि आप किसी डेटाबेस को SERVER1 से LOCALHOST में कॉपी करने का प्रयास कर रहे हैं, तो आप इस कमांड को अपने LOCALHOST पर चला सकते हैं:
ssh -L27018:localhost:27017 SERVER1
(स्पष्ट रूप से SERVER1 को अपने वास्तविक सर्वर या ssh उपनाम से बदलें)
यह SERVER1 के लिए एक SSH कनेक्शन खोलता है, लेकिन LOCALHOST पर पोर्ट 27018 को SERVER1 पर दूरस्थ पोर्ट 27017 पर भी मैप करता है। उस SSH कनेक्शन को बंद न करें, और अब पोर्ट 27018 के साथ अपने लोकलहोस्ट मशीन पर MongoDB से कनेक्ट करने का प्रयास करें, जैसे:
mongo --port 27018
आप देखेंगे कि यह अब SERVER1 पर डेटा है, सिवाय इसके कि आप इसे अपनी स्थानीय मशीन से एक्सेस कर रहे हैं।
MongoDB सामान्य रूप से चल रहा है:
mongo
(या mongo --port 27107
)
आपकी स्थानीय मशीन होगी।
अब, चूंकि आपके पास तकनीकी रूप से (आपके LOCALHOST पर, जहां आपने SSH सुरंग चलाई थी):
- मोंगोडीबी (LOCALHOST) 27017 को
- मोंगोडीबी (SERVER1) 27018 को
आप बस उपयोग कर सकते हैं db.copyDatabase()
डेटा पर कॉपी करने के लिए MongoDB (LOCALHOST) के अंदर कार्य करें।
LOCALHOST ON PORT 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");
आपको यह सब एक शेल स्क्रिप्ट में लपेटने में सक्षम होना चाहिए जो आपके लिए इन सभी आदेशों को निष्पादित कर सके। मेरे पास खुद एक है, लेकिन इसमें वास्तव में कुछ अतिरिक्त कदम हैं जो शायद इसे थोड़ा और भ्रमित कर देंगे :)
ऐसा करने से, और MongoDB के मूल db.copyDatabase() फ़ंक्शन का उपयोग करने से आपको डंप/ज़िप/पुनर्स्थापित करने से रोका जा सकेगा। बेशक, यदि आप अभी भी उस मार्ग पर जाना चाहते हैं, तो mongodump
चलाना बहुत कठिन नहीं होगा , डेटा निर्यात करें, tar/gzip करें, फिर scp TARGETSERVER:/path/to/file /local/path/to/file
का उपयोग करें इसे नीचे खींचने और mongorestore
चलाने के लिए उस पर।
बस और काम लगता है!
संपादित करें - यहाँ एक SH और JS फ़ाइल है जो एक साथ मिलकर एक शेल स्क्रिप्ट बनाती है जिसके साथ आप इसे चला सकते हैं। इन्हें अपने LOCALHOST पर चलाएँ , उन्हें लाइव पर न चलाएं या यह लाइव पर db.dropDatabase करेगा। इन दो फ़ाइलों को एक ही फ़ोल्डर में रखें, और YourSERVERNAME को बदलें pull-db.sh
. में डोमेन/आईपी/एसएसएच उपनाम के साथ, और फिर pull-db.js
. में अपने डेटाबेस का नाम जो भी हो, उसमें DBNAMEHERE बदलें।
मैं आमतौर पर scripts
. नामक फ़ोल्डर बनाता हूं मेरी परियोजनाओं में, और टेक्स्टमेट का उपयोग करके, मुझे बस ⌘+R
. को हिट करना है जबकि pull-db.sh
इसे निष्पादित करने के लिए संपादित करने के लिए खुला है।
पुल-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
पुल-db.js
use DBNAMEHERE;
db.dropDatabase();
use DBNAMEHERE;
db.copyDatabase("DBNAMEHERE","DBNAMEHERE","localhost:27018");
मैंने शेल स्क्रिप्ट में कुछ अतिरिक्त कोड जोड़ा है ताकि यह पता चल सके कि यह क्या कर रहा है (सॉर्टा)। स्क्रिप्ट में स्लीप टाइमर केवल SSH कनेक्शन को अगली लाइन चलाने से पहले कनेक्ट होने का समय देने के लिए हैं। मूल रूप से, यहाँ क्या होता है:
- कोड की पहली पंक्ति आपकी मशीन पर सुरंग बनाती है, और ECHO, SLEEP, फिर EXIT को दूरस्थ SSH सत्र में भेजती है।
- फिर यह 5 सेकंड प्रतीक्षा करता है, जो चरण 1 में SSH सत्र को कनेक्ट होने देता है।
- फिर हम पुल-डीबी.जेएस फ़ाइल को स्थानीय मोंगो शेल में पाइप करते हैं। (चरण #1 5 सेकंड के भीतर किया जाना चाहिए...)
- पुल-डीबी.जेएस अब मोंगो में चलना चाहिए, और चरण # 1 में एसएसएच टर्मिनल कनेक्शन खुलने के बाद शायद 10 सेकंड के लिए चला गया है, और EXIT को इसके सत्र में भेज दिया गया है। आदेश जारी किया गया है, फिर भी, चरण # 3 से गतिविधि पूर्ण होने तक एसएसएच सत्र वास्तव में खुला रहेगा।
- जैसे ही आपकी पुल-डीबी.जेएस स्क्रिप्ट रिमोट सर्वर से आपके सभी डेटा को खींचती है, रिमोट सर्वर पर चरण # 1 में जारी EXIT कमांड को अंततः कनेक्शन बंद करने की अनुमति दी जाती है, आपके लोकलहोस्ट पर 27108 को अनबाइंड कर दिया जाता है।
अब आपके पास अपने दूरस्थ डेटाबेस का सारा डेटा आपके लोकलहोस्ट में होना चाहिए।