आप एक MongoDB डेटाबेस का नाम कैसे बदल सकते हैं?


483

मेरे MongoDB डेटाबेस नाम में एक टाइपो है और मैं डेटाबेस का नाम बदलना चाह रहा हूं।

मैं कॉपी कर सकता हूं और हटा सकता हूं ...

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

क्या डेटाबेस का नाम बदलने की आज्ञा है?


से मोंगो 4.2 भी copyDatabaseभी है पदावनत
सुमित रामटेके

जवाबों:


208

नहीं वहाँ नहीं है। Https://jira.mongodb.org/browse/SERVER-701 देखें

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

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

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

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

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


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

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

तो MongoDB में एक कमांड होनी चाहिए जो दो कार्यों को बुलाती है, कॉपी और ड्रॉप करती है? मैं इस एकल आदेश के लिए एक बड़ा कारण नहीं देखता। लेकिन यह कुछ के लिए अच्छा हो सकता है।
TamusJRoyce

जब आप डेटाबेस को शुरू करने के लिए नाम देते हैं, तो वह केवल आंतरिक नाम के लिए एक उपनाम होना चाहिए जो कि मोंगो उत्पन्न करता है (विश्व स्तर पर अद्वितीय नामकरण सम्मेलन का उपयोग करके)। इस तरह, डेटाबेस का नाम बदलना उतना ही सरल है जितना कि उपनाम और इसे क्लस्टर के सभी नोड्स में प्रचारित करना। मैं कहती हूं कि मैं चाहता हूं। यह मामला नहीं है।
लोनी बेस्ट

396

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

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

संपादकीय नोट: यह वही प्रश्न में उपयोग किया जाता है, लेकिन दूसरों की परवाह किए बिना उपयोगी साबित हुआ है।


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

15
ध्यान दें कि यह काम नहीं करता है जब db_to_rename और db_renamed केवल मामले में भिन्न होते हैं। आपको उस स्थिति में एक अस्थायी डेटाबेस का उपयोग करना होगा। (मैं बस इस में भाग गया :)
सेबस्टियन एम

71
यह ओपी द्वारा प्रदान किए गए समाधान से कैसे अलग है?
साल्वाडोर डाली

5
यह एकमात्र अंतर के साथ वास्तविक प्रश्न है जो copyDatabaseविधि में तीसरा तर्क है
गुरबख्श सिंह

2
यह एकमात्र प्रश्न है, जिसमें एकमात्र अंतर copyDatabaseविधि * में तीसरा तर्क है , जो कि अनावश्यक है, और इसलिए एक बुरा समाधान है कि ओपी को पहले से ही पता था। * cc @GurbakhshishSingh
Trindaz

164

वैकल्पिक समाधान: आप अपने डीबी को डंप कर सकते हैं और इसे अलग-अलग नाम से पुनर्स्थापित कर सकते हैं। जैसा कि मैंने अनुभव किया है कि यह बहुत जल्दी है 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/


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

यह भी खूब रही! मेरे पास पहले से ही बना हुआ था mongodump। Didnt जानते हैं कि आप इसे किसी भिन्न नाम से पुनर्स्थापित कर सकते हैं। धन्यवाद!
दुष्यंत बंगाल

5
नोट: यदि आप उपयोग करते हैं --gzipऔर एक संग्रह बनाते हैं तो यह काम नहीं करता है
दुष्यंत बंगल

9
यह अब अनुशंसित तरीका है, क्योंकि db.copyDatabase()अब पदावनत कर दिया गया है
ऑसोल्मज़

यह देखते हुए कि नहीं, --db( -d) तर्क स्वयं भी पदावनत है। वहाँ एक पदावनत पार्टी का एक सा चल रहा है, ऐसा लगता है, दिया copyDatabaseभी गया है। मैंने अपने नोट्स के साथ SERVER-701 पोक किया है ।
अमाकाली

28

नोट: उम्मीद है कि यह नवीनतम संस्करण में बदल गया है।

आप एक MongoDB 4.0 mongod उदाहरण (FCV मान की परवाह किए बिना) और एक MongoDB 3.4 और पहले के mongod उदाहरण के बीच डेटा की प्रतिलिपि नहीं बना सकते। https://docs.mongodb.com/v4.0/reference/method/db.copyDatabase/

ALERT : अरे लोग सिर्फ डेटाबेस की नकल करते समय सावधान रहें, अगर आप एकल डेटाबेस के तहत अलग-अलग संग्रहों को गड़बड़ाना नहीं चाहते हैं।

निम्नलिखित आपको बताता है कि नाम कैसे बदला जाए

> show dbs;
testing
games
movies

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

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

उदाहरण:

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

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

use testing;

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

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

उदाहरण:

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

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



@amcgregor को सूचित करने के लिए धन्यवाद। मैंने उसी के लिए एक टिप्पणी जोड़ी है। आशा है कि यह कुछ मदद करता है।
चन्नवीर हकारी

8

हालांकि मोंगोडब का नाम डेटाबेस आदेश प्रदान नहीं करता है, यह r ename संग्रह कमांड प्रदान करता है , जो न केवल संग्रह नाम को संशोधित करता है, बल्कि डेटाबेस नाम को भी संशोधित करता है।

db.adminCommand({renameCollection: "db1.test1", to: "db2.test2"})

यह आदेश केवल मेटाडेटा को संशोधित करता है, लागत बहुत कम है, हमें केवल नाम बदलने के लिए सभी संग्रह को नीचे करना होगा db1, नाम db2बदलने के लिए डेटाबेस का नाम प्राप्त करना होगा।
आप इसे इस Js स्क्रिप्ट में कर सकते हैं

var source = "source";
var dest = "dest";
var colls = db.getSiblingDB(source).getCollectionNames();
for (var i = 0; i < colls.length; i++) {
var from = source + "." + colls[i];
var to = dest + "." + colls[i];
db.adminCommand({renameCollection: from, to: to});
}

अनुक्रमणिका और अन्य मेटाडेटा के बारे में क्या वे बनाए या खोए हुए हैं?
उदित भारद्वाज

@ यूडीबी बहुत संरक्षित होने की संभावना है। "एक संग्रह का नाम बदलना" एक नाम स्थान परिवर्तन है , अनिवार्य रूप fooसे barडेटाबेस के भीतर आपके संग्रह का नाम एक नाम स्थान है bar.foo। इस _idप्रकार सूचकांक में नाम स्थान है bar.foo._id_। संग्रह का नामकरण (करना) एक उपसर्ग खोज करना और सभी नामस्थानों पर प्रतिस्थापित करना जो इसके बारे में --nsFromऔर --nsTo विकल्पों केmongorestore समान है
अमूलर

1
लागत बड़ी हो सकती है! docs.mongodb.com/manual/reference/command/renameCollection/… यदि लक्ष्य डेटाबेस स्रोत डेटाबेस के समान है, तो renameCollection बस नाम स्थान को बदल देता है। यह एक त्वरित ऑपरेशन है। यदि लक्ष्य डेटाबेस स्रोत डेटाबेस से भिन्न होता है, तो renameCollection स्रोत संग्रह से सभी दस्तावेजों को लक्ष्य संग्रह में कॉपी करता है। संग्रह के आकार के आधार पर, इसे पूरा होने में अधिक समय लग सकता है।
नगिल्ज़

कृपया अपना उत्तर बदलें। आपका उत्तर सहायक है, क्योंकि इस आदेश के साथ एक संग्रह को किसी अन्य डेटाबेस में ले जाना संभव है। लेकिन यह गलत है, और यह दूसरों को गुमराह कर सकता है।
नगिल्ज़

6

उपरोक्त प्रक्रिया धीमी है, आप नीचे दी गई विधि का उपयोग कर सकते हैं लेकिन आपको संग्रह को दूसरे db पर संग्रह करने की आवश्यकता है।

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

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

1
स्क्रैच कि, यह वैसे भी एक प्रतिलिपि करता है (क्योंकि यह स्थान को नहीं हटाता है, यह वास्तव में एक सरल नाम नहीं है) इसलिए कॉपी और ड्रॉप पर इस पद्धति का कोई वास्तविक लाभ नहीं है।
सरफज़

5

डेटाबेस को फिर से नाम देने के लिए कोई तंत्र नहीं है। लेखन के समय वर्तमान में स्वीकार जवाब तथ्यात्मक रूप से सही है और बहाना नदी के ऊपर के रूप में प्रदान करता है कुछ दिलचस्प पृष्ठभूमि विस्तार है, लेकिन व्यवहार नकल के लिए प्रदान करता है कोई सुझाव नहीं। अन्य उत्तर इंगित करते हैं copyDatabase, जो अब कोई विकल्प नहीं है क्योंकि 4.0 में कार्यक्षमता को हटा दिया गया है । मैंने अपने नोट्स और अविश्वसनीयता के साथ SERVER-701 अपडेट किया है । 🙃

समतुल्य व्यवहार शामिल है mongodumpऔर mongorestoreएक नृत्य में:

  1. उपयोग में "नामस्थान" का नोट बनाते हुए, अपना डेटा निर्यात करें। उदाहरण के लिए, मेरे एक डेटासेट पर, मेरे पास नामस्थान के साथ एक संग्रह है byzmcbehoomrfjcs9vlj.Analytics- जो कि अगले चरण में उपसर्ग ( वास्तव में डेटाबेस का नाम ) की आवश्यकता होगी।

  2. अपने डेटा, आपूर्ति --nsFromऔर --nsToतर्कों को आयात करें । ( दस्तावेज़ीकरण। ) मेरे उपरोक्त काल्पनिक (और बेहद अपठनीय) उदाहरण के साथ जारी रखते हुए, अधिक कामुक नाम को पुनर्स्थापित करने के लिए, मैं आह्वान करता हूं:

mongorestore --archive=backup.agz --gzip --drop \
    --nsFrom 'byzmcbehoomrfjcs9vlj.*' --nsTo 'rita.*'

कुछ भी --dbmongorestore के तर्क पर इंगित कर सकते हैं , हालांकि, यह भी, हटा दिया गया है और पूरी तरह से गलत सुझाव के साथ गैर-BSON फ़ोल्डर बैकअप पर उपयोग के खिलाफ चेतावनी को ट्रिगर करता है " use --nsInclude instead"। उपरोक्त नाम स्थान अनुवाद --dbविकल्प के उपयोग के बराबर है , और उपयोग करने के लिए सही नाम स्थान हेरफेर सेटअप है क्योंकि हम जो कुछ भी बहाल किया जा रहा है उसे फ़िल्टर करने का प्रयास नहीं कर रहे हैं।


1
--nsFromऔर --nsToमेरे लिए काम किया। धन्यवाद!
भार्गव शाह

nsFrom के साथ मोंगोडंप / 2020 तक आधिकारिक उत्तर हैं
पाओलोके

4

मैंने करने की कोशिश की।

db.copyDatabase('DB_toBeRenamed','Db_newName','host') 

और पता चला कि यह मोंगू समुदाय द्वारा पदावनत किया गया है, हालांकि इसने बैकअप या नाम बदलकर डीबी बनाया है।

WARNING: db.copyDatabase is deprecated. See http://dochub.mongodb.org/core/copydb-clone-deprecation
{
        "note" : "Support for the copydb command has been deprecated. See 
        http://dochub.mongodb.org/core/copydb-clone-deprecation",
        "ok" : 1
}

इसलिए उपरोक्त दृष्टिकोण से आश्वस्त नहीं हूं, मुझे नीचे कमांड का उपयोग करके डंप ऑफ लोकल लेना था

mongodump --host --db DB_TobeRenamed --out E://FileName/

Db से जुड़ा।

use DB_TobeRenamed

फिर

db.dropDatabase()

फिर डीबी को कमान के साथ बहाल किया।

mongorestore -host hostName -d Db_NewName E://FileName/

2

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

use old_db
db.getCollectionNames().forEach(function(collName) {
    db[collName].find().forEach(function(d){
        db.getSiblingDB('new_db')[collName].insert(d); 
    }) 
});
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.