2012-02-08 15 views
361

मेरे मोंगोडीबी डेटाबेस नाम में एक टाइपो है और मैं डेटाबेस का नाम बदलना चाहता हूं।आप एक मोंगोडीबी डेटाबेस का नाम कैसे बदलते हैं?

मैं copy और हटाना इतना की तरह ...

db.copyDatabase('old_name', 'new_name'); 
use old_name 
db.dropDatabase(); 

वहाँ एक डेटाबेस का नाम बदलने के लिए एक आदेश है?

उत्तर

152

कोई नहीं है। देखें https://jira.mongodb.org/browse/SERVER-701

दुर्भाग्य से, यह एक सरल सुविधा हमें कारण तरीका है कि डेटाबेस मेटाडाटा मूल (डिफ़ॉल्ट) भंडारण इंजन में संग्रहित है करने के लिए लागू करने के लिए के लिए नहीं है। MMAPv1 फ़ाइलों में, नामस्थान (उदा .: dbName.collection) जो प्रत्येक संग्रह और अनुक्रमणिका का वर्णन करता है, डेटाबेस नाम शामिल है, इसलिए डेटाबेस फ़ाइलों के एक समूह का नाम बदलने के लिए, प्रत्येक एकल नाम स्ट्रिंग को फिर से लिखना होगा। यह प्रभाव डालता है:

  • .ns फ़ाइल
  • संग्रह
  • हर सूचकांक के लिए नाम स्थान के लिए हर एक क्रमांकित फ़ाइल
  • प्रत्येक संग्रह और सूचकांक system.namespaces की
  • सामग्री की आंतरिक अद्वितीय नामों और system.indexes (या भविष्य में उनके समकक्ष)
  • अन्य स्थानों में मुझे

यह स्टैंडअलोन मैंगोड उदाहरण में एकल डेटाबेस का नाम बदलने के लिए है। प्रतिलिपि सेट के लिए उपरोक्त प्रत्येक प्रतिकृति नोड पर, प्रत्येक नोड पर प्रत्येक एकल ओप्लॉग प्रविष्टि पर यह करने की आवश्यकता होगी जो इस डेटाबेस को किसी भी तरह से अमान्य या फिर से लिखा जाना चाहिए, और फिर यदि यह एक शापित क्लस्टर है, तो उसे भी इन्हें जोड़ना होगा यदि डीबी को दाढ़ी दी जाती है तो प्रत्येक शर्ड में परिवर्तन होता है, साथ ही कॉन्फ़िगर सर्वरों के पास नामों के संदर्भ में नामों के संदर्भ में सभी शर्ड मेटाडेटा होते हैं।

लाइव सिस्टम पर ऐसा करने का बिल्कुल कोई तरीका नहीं होगा।

यह ऑफ़लाइन करने के लिए, यह फिर से लिखने के नए नाम को समायोजित करने के हर एक डेटाबेस फ़ाइल की आवश्यकता होगी, और उस बिंदु पर यह वर्तमान "copydb" कमांड के रूप में के रूप में धीमी गति से होगा ...

+2

वह टिकट बहुत लंबे समय तक खुला रहा है। मैंने पहले से ही लंबी सूची में अपना कम से कम महत्वपूर्ण वोट जोड़ा है। –

+2

जिस तरह से उन्होंने डीबी बनाया है और इसे समझाया है, नामकरण असंभव लगता है - एक नया नया आर्किटेक्चर ले सकता है। एक बड़ी निगरानी की तरह लगता है लेकिन सभी प्यार, युद्ध और सॉफ्टवेयर विकास में निष्पक्ष हैं। – staypuftman

+1

यह अभी भी मोंगो डीबी 3.4 अप्रैल, 30, 2017 के रूप में सच है। – Daniel

314

आप ऐसा कर सकता है:

db.copyDatabase("db_to_rename","db_renamed","localhost") 
use db_to_rename 
db.dropDatabase(); 

संपादकीय नोट: इस एक ही सवाल अपने आप में इस्तेमाल किया दृष्टिकोण है, लेकिन परवाह किए बिना दूसरों के लिए उपयोगी साबित हो गया है।

+0

उत्तर 'copyDatabase' के तीसरे तर्क के संबंध में भ्रमित है। स्पष्ट होने के लिए [मोंगोडीबी कॉपी डेटाबेस कमांड] (http://www.mongodb.org/display/DOCS/Copy+Database+Commands) देखें। –

+0

तीसरे तर्क के लिए मैं "लोकलहोस्ट" डालने का सुझाव देता हूं। स्पष्टता के लिए संपादित – bzmw

+28

तीसरा तर्क वास्तव में छोड़ा जा सकता है, और यह उसी सर्वर पर डिफ़ॉल्ट होगा। – Haakon

103

वैकल्पिक समाधान: आप अपने डीबी को डंप कर सकते हैं और इसे अलग-अलग नाम से बहाल कर सकते हैं। जैसा कि मैंने अनुभव किया है यह db.copyDatabase() से बहुत तेज है।

$ mongodump -d old_db_name -o mongodump/ 
$ mongorestore -d new_db_name mongodump/old_db_name 

http://docs.mongodb.org/manual/tutorial/backup-with-mongodump/

+0

मुझे बहुत मदद करता है !! – Cyborgz

+4

यह तेज़ और "साइड इफेक्ट" के रूप में है, आपका डेटाबेस भी कॉम्पैक्ट किया गया है। – Comtaler

+0

यह बहुत अच्छा है! मेरे पास पहले से ही 'मोंगोडम्प' बनाया गया था। पता नहीं था कि आप इसे एक अलग नाम से बहाल कर सकते हैं। धन्यवाद! –

4

उपरोक्त प्रक्रिया धीमी है, आप विधि नीचे का उपयोग कर सकते हैं, लेकिन आप एक और डाटाबेस के संग्रह से संग्रह बढ़ने की जरूरत है।

use admin 
db.runCommand({renameCollection: "[db_old_name].[collection_name]", to: "[db_new_name].[collection_name]"}) 
+0

उत्कृष्ट सुझाव IMHO। हालांकि, यह ध्यान देने योग्य है कि यह मूल डीबी से स्थान मुक्त नहीं करेगा लेकिन डेटा की प्रतिलिपि बनाने से नाम बदलना बहुत तेज़ होना चाहिए। – sirfz

+0

स्क्रैच करें कि, यह किसी भी प्रतिलिपि करता है (चूंकि यह स्थान को नहीं हटाता है, यह वास्तव में एक साधारण नाम नहीं है) इसलिए प्रतिलिपि और ड्रॉप पर इस विधि का कोई वास्तविक लाभ नहीं है। – sirfz

6

चेतावनी: अरे लोग बहुत सावधान करते हुए, डेटाबेस को कॉपी अगर आप एकल डाटाबेस के तहत विभिन्न संग्रह गंदगी नहीं करना चाहते हो सकता है।

db.copyDatabase('testing','newTesting') 

अब आप सुरक्षित रूप पुराने हटा सकते हैं:

निम्नलिखित आप

> show dbs; 
testing 
games 
movies 

नाम बदलने के लिए कैसे आप निम्न सिंटैक्स का उपयोग

db.copyDatabase("old db name","new db name") 

उदाहरण नाम बदलने के लिए पता चलता डीबी निम्नलिखित तरीके से

use testing; 

db.dropDatabase(); //Here the db **testing** is deleted successfully 

अब बस लगता है कि अगर आप मौजूदा डेटाबेस नाम के साथ नए डेटाबेस नाम का नाम बदलने की कोशिश क्या होता है

उदाहरण:

db.copyDatabase('testing','movies'); 

तो इस संदर्भ सभी संग्रह (टेबल्स) की में परीक्षण की प्रतिलिपि फिल्मों डेटाबेस पर कॉपी की जाएगी।

2

यदि आप अपने सभी डेटा को व्यवस्थापक डेटाबेस में डालते हैं (आपको नहीं करना चाहिए), तो आप देखेंगे कि db.copyDatabase() काम नहीं करेगा क्योंकि आपके उपयोगकर्ता को बहुत सारे विशेषाधिकारों की आवश्यकता है जो आप शायद इसे देना नहीं चाहते हैं। डेटाबेस को मैन्युअल रूप से कॉपी करने के लिए यहां एक स्क्रिप्ट है:

use old_db 
db.getCollectionNames().forEach(function(collName) { 
    db[collName].find().forEach(function(d){ 
     db.getSiblingDB('new_db')[collName].insert(d); 
    }) 
}); 
संबंधित मुद्दे