मेरे MongoDB डेटाबेस नाम में एक टाइपो है और मैं डेटाबेस का नाम बदलना चाह रहा हूं।
मैं कॉपी कर सकता हूं और हटा सकता हूं ...
db.copyDatabase('old_name', 'new_name');
use old_name
db.dropDatabase();
क्या डेटाबेस का नाम बदलने की आज्ञा है?
मेरे MongoDB डेटाबेस नाम में एक टाइपो है और मैं डेटाबेस का नाम बदलना चाह रहा हूं।
मैं कॉपी कर सकता हूं और हटा सकता हूं ...
db.copyDatabase('old_name', 'new_name');
use old_name
db.dropDatabase();
क्या डेटाबेस का नाम बदलने की आज्ञा है?
जवाबों:
नहीं वहाँ नहीं है। Https://jira.mongodb.org/browse/SERVER-701 देखें
दुर्भाग्यवश, डेटाबेस मेटाडेटा को मूल (डिफ़ॉल्ट) संग्रहण इंजन में संग्रहीत करने के तरीके के कारण इसे लागू करना हमारे लिए एक सरल विशेषता नहीं है। MMAPv1 फ़ाइलों में, प्रत्येक एकल संग्रह और अनुक्रमणिका का वर्णन करने वाले नामस्थान (जैसे: dbName.collection) में डेटाबेस का नाम शामिल है, इसलिए डेटाबेस फ़ाइलों के एक सेट का नाम बदलने के लिए, हर एक नाम स्थान स्ट्रिंग को फिर से लिखना होगा। यह प्रभाव डालता है:
- .ns फ़ाइल
- संग्रह के लिए हर एक गिने फ़ाइल
- हर सूचकांक के लिए नाम स्थान
- प्रत्येक संग्रह और सूचकांक के आंतरिक अद्वितीय नाम
- system.namespaces और system.indexes की सामग्री (या भविष्य में उनके समकक्ष)
- अन्य स्थान जो मुझे याद आ रहे हैं
यह एक स्टैंडअलोन में एकल डेटाबेस का नाम बदलने के लिए है मोंगॉड उदाहरण लिए है। प्रतिकृति सेट के लिए ऊपर प्रत्येक प्रतिकृति नोड पर किए जाने की आवश्यकता होगी, साथ ही प्रत्येक नोड पर प्रत्येक एकल oplog प्रविष्टि जो इस डेटाबेस को संदर्भित करता है, को किसी तरह अमान्य या फिर से लिखना होगा, और फिर यदि यह एक धारदार क्लस्टर है, तो इन्हें भी जोड़ना होगा यदि डीबी को शार्प किया जाता है, तो हर शार्द में परिवर्तन होता है, साथ ही कॉन्फिगर सर्वर में सभी शार्प मेटाडेटा होते हैं, जो उनके पूर्ण नामों के साथ नामस्थानों के संदर्भ में होते हैं।
लाइव सिस्टम पर ऐसा करने का कोई तरीका नहीं होगा।
इसे ऑफ़लाइन करने के लिए, नए नाम को समायोजित करने के लिए हर एक डेटाबेस फ़ाइल को फिर से लिखना होगा, और उस समय यह वर्तमान "कोपिडब" कमांड की तरह धीमा होगा ...
आप ऐसा कर सकते हैं:
db.copyDatabase("db_to_rename","db_renamed","localhost")
use db_to_rename
db.dropDatabase();
संपादकीय नोट: यह वही प्रश्न में उपयोग किया जाता है, लेकिन दूसरों की परवाह किए बिना उपयोगी साबित हुआ है।
copyDatabase
विधि में तीसरा तर्क है
copyDatabase
विधि * में तीसरा तर्क है , जो कि अनावश्यक है, और इसलिए एक बुरा समाधान है कि ओपी को पहले से ही पता था। * cc @GurbakhshishSingh
वैकल्पिक समाधान: आप अपने डीबी को डंप कर सकते हैं और इसे अलग-अलग नाम से पुनर्स्थापित कर सकते हैं। जैसा कि मैंने अनुभव किया है कि यह बहुत जल्दी है 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/
mongodump
। Didnt जानते हैं कि आप इसे किसी भिन्न नाम से पुनर्स्थापित कर सकते हैं। धन्यवाद!
--gzip
और एक संग्रह बनाते हैं तो यह काम नहीं करता है
db.copyDatabase()
अब पदावनत कर दिया गया है
--db
( -d
) तर्क स्वयं भी पदावनत है। वहाँ एक पदावनत पार्टी का एक सा चल रहा है, ऐसा लगता है, दिया copyDatabase
भी गया है। मैंने अपने नोट्स के साथ SERVER-701 पोक किया है ।
नोट: उम्मीद है कि यह नवीनतम संस्करण में बदल गया है।
आप एक 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');
इसलिए इस संदर्भ में परीक्षण के सभी संग्रह (तालिकाओं) को मूवी डेटाबेस पर कॉपी किया जाएगा ।
copyDatabase
चला गया। मैंने अपने नोट्स के साथ SERVER-701 पोक किया है ।
हालांकि मोंगोडब का नाम डेटाबेस आदेश प्रदान नहीं करता है, यह 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
समान है ।
उपरोक्त प्रक्रिया धीमी है, आप नीचे दी गई विधि का उपयोग कर सकते हैं लेकिन आपको संग्रह को दूसरे db पर संग्रह करने की आवश्यकता है।
use admin
db.runCommand({renameCollection: "[db_old_name].[collection_name]", to: "[db_new_name].[collection_name]"})
डेटाबेस को फिर से नाम देने के लिए कोई तंत्र नहीं है। लेखन के समय वर्तमान में स्वीकार जवाब तथ्यात्मक रूप से सही है और बहाना नदी के ऊपर के रूप में प्रदान करता है कुछ दिलचस्प पृष्ठभूमि विस्तार है, लेकिन व्यवहार नकल के लिए प्रदान करता है कोई सुझाव नहीं। अन्य उत्तर इंगित करते हैं copyDatabase
, जो अब कोई विकल्प नहीं है क्योंकि 4.0 में कार्यक्षमता को हटा दिया गया है । मैंने अपने नोट्स और अविश्वसनीयता के साथ SERVER-701 अपडेट किया है । 🙃
समतुल्य व्यवहार शामिल है mongodump
और mongorestore
एक नृत्य में:
उपयोग में "नामस्थान" का नोट बनाते हुए, अपना डेटा निर्यात करें। उदाहरण के लिए, मेरे एक डेटासेट पर, मेरे पास नामस्थान के साथ एक संग्रह है byzmcbehoomrfjcs9vlj.Analytics
- जो कि अगले चरण में उपसर्ग ( वास्तव में डेटाबेस का नाम ) की आवश्यकता होगी।
अपने डेटा, आपूर्ति --nsFrom
और --nsTo
तर्कों को आयात करें । ( दस्तावेज़ीकरण। ) मेरे उपरोक्त काल्पनिक (और बेहद अपठनीय) उदाहरण के साथ जारी रखते हुए, अधिक कामुक नाम को पुनर्स्थापित करने के लिए, मैं आह्वान करता हूं:
mongorestore --archive=backup.agz --gzip --drop \
--nsFrom 'byzmcbehoomrfjcs9vlj.*' --nsTo 'rita.*'
कुछ भी --db
mongorestore के तर्क पर इंगित कर सकते हैं , हालांकि, यह भी, हटा दिया गया है और पूरी तरह से गलत सुझाव के साथ गैर-BSON फ़ोल्डर बैकअप पर उपयोग के खिलाफ चेतावनी को ट्रिगर करता है " use --nsInclude instead
"। उपरोक्त नाम स्थान अनुवाद --db
विकल्प के उपयोग के बराबर है , और उपयोग करने के लिए सही नाम स्थान हेरफेर सेटअप है क्योंकि हम जो कुछ भी बहाल किया जा रहा है उसे फ़िल्टर करने का प्रयास नहीं कर रहे हैं।
--nsFrom
और --nsTo
मेरे लिए काम किया। धन्यवाद!
मैंने करने की कोशिश की।
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/
उस स्थिति में जब आप अपना सारा डेटा एडमिन डेटाबेस में डालते हैं (आपको ऐसा नहीं करना चाहिए), आप ध्यान db.copyDatabase()
नहीं देंगे क्योंकि आपके उपयोगकर्ता को बहुत सारे विशेषाधिकारों की आवश्यकता होती है जिन्हें आप शायद देना नहीं चाहते हैं। यहाँ डेटाबेस को मैन्युअल रूप से कॉपी करने के लिए एक स्क्रिप्ट है:
use old_db
db.getCollectionNames().forEach(function(collName) {
db[collName].find().forEach(function(d){
db.getSiblingDB('new_db')[collName].insert(d);
})
});
copyDatabase
भी है पदावनत