আপনি একটি মঙ্গোডিবি ডাটাবেসটির কীভাবে নাম পরিবর্তন করবেন?


483

আমার মঙ্গোডিবি ডাটাবেসের নামে একটি টাইপ আছে এবং আমি ডাটাবেসটির নাম পরিবর্তন করতে চাইছি।

আমি এর মতো অনুলিপি এবং মুছতে পারি ...

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

একটি ডাটাবেস নামকরণের জন্য একটি আদেশ আছে?


থেকে মোঙ্গো 4.2 এমনকি copyDatabaseহয় অবচিত
সুমিত Ramteke

উত্তর:


208

না সেখানে নেই। Https://jira.mongodb.org/browse/SERVER-701 দেখুন

দুর্ভাগ্যক্রমে, ডাটাবেস মেটাডেটা মূল (ডিফল্ট) স্টোরেজ ইঞ্জিনে যেভাবে সংরক্ষণ করা হয়েছে তার কারণে এটি কার্যকর করার জন্য আমাদের পক্ষে এটি সাধারণ বৈশিষ্ট্য নয়। এমএমএএপিভি 1 ফাইলগুলিতে, প্রতিটি স্পষ্ট সংগ্রহ এবং সূচকে বর্ণিত নেমস্পেস (যেমন: dbName.colલેક્શન) ডাটাবেসের নাম অন্তর্ভুক্ত করে, তাই ডাটাবেস ফাইলগুলির একটি সেটটির নাম পরিবর্তন করতে, প্রতিটি একক নেমস্পেসের স্ট্রিংটি আবার লিখতে হবে। এই প্রভাবগুলি:

  • .ns ফাইল
  • সংগ্রহের জন্য প্রতিটি একক সংখ্যাযুক্ত ফাইল
  • প্রতিটি সূচকের জন্য নেমস্পেস
  • প্রতিটি সংগ্রহ এবং সূচকের অভ্যন্তরীণ অনন্য নাম
  • system.namespaces এবং system.indexes এর সামগ্রী (বা ভবিষ্যতে তাদের সমতুল্য)
  • অন্যান্য লোকেশন আমি অনুপস্থিত হতে পারে

এটি কেবলমাত্র একটি একক ডাটাবেসের একটি স্বতন্ত্র মঙ্গোদ ইভেন্টে পুনর্নবীকরণ সম্পন্ন করার জন্য । প্রতিরূপ সেট করার জন্য উপরের প্রতিটি প্রতিলিপি নোডে করা দরকার ছিল, প্রতিটি নোডে প্রতিটি একক আফগল এন্ট্রি যা এই ডাটাবেসটিকে বোঝায় কোনওভাবে অবৈধ বা পুনর্লিখন করতে হবে, এবং তারপরে যদি এটি একটি তীক্ষ্ণ ক্লাস্টার হয় তবে এগুলি যুক্ত করতে হবে ডিবি তীক্ষ্ণ করা থাকলে প্রতিটি শ্যাডে পরিবর্তন হয়, এবং কনফিগার সার্ভারগুলির পুরো নাম সহ নেমস্পেসের ক্ষেত্রে সমস্ত শারড মেটাডেটা থাকে।

লাইভ সিস্টেমে এটি করার কোনও উপায় নেই।

এটি অফলাইনে করার জন্য, নতুন নামটি সংযুক্ত করার জন্য প্রতিটি একক ডাটাবেস ফাইলটি পুনরায় লেখার প্রয়োজন হবে এবং সেই সময়ে এটি বর্তমান "কপিরডিবি" কমান্ডের মতো ধীর হবে ...


4
সেই টিকিটটি খুব দীর্ঘ সময় ধরে খোলা ছিল। আমি আমার কম-গুরুত্বপূর্ণ ভোট ইতিমধ্যে দীর্ঘ তালিকায় যুক্ত করেছি।
ডিজে ভ্যান উইক

4
তারা যেভাবে ডিবি তৈরি করেছেন এবং ব্যাখ্যা করেছেন, নামকরণ অসম্ভব বলে মনে হচ্ছে - এটি পুরোপুরি নতুন আর্কিটেকচার গ্রহণ করতে পারে। বড় পর্যবেক্ষণের মতো বলে মনে হচ্ছে তবে এটি প্রেম, যুদ্ধ এবং সফটওয়্যার বিকাশে ন্যায্য।
সেরোসেস

সুতরাং মঙ্গোডিবিতে একটি কমান্ড থাকা উচিত যা দুটি ফাংশন, অনুলিপি এবং ড্রপ কল করে? এই একক আদেশের বড় কারণ আমি দেখতে পাচ্ছি না। তবে এটি কারওর কাছে ভাল লাগতে পারে।
TamusJRoyce 14

আপনি যখন শুরু করতে ডাটাবেসটির নাম রাখবেন, তখন মঙ্গো যে অভ্যন্তরীণ নামটি তৈরি করে (বিশ্বব্যাপী অনন্য নামকরণ কনভেনশন ব্যবহার করে) তার কেবলমাত্র একটি নাম থাকতে হবে। এইভাবে, একটি ডাটাবেসের নাম পরিবর্তন করা সেই উরফ পরিবর্তন করা এবং এটি ক্লাস্টারের সমস্ত নোডে প্রচার করার মতোই সহজ। আমি বলি। এই ক্ষেত্রে না হয়.
লনি সেরা

396

আপনি এটি করতে পারেন:

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

সম্পাদকীয় দ্রষ্টব্য: এটি একই প্রশ্নে নিজেই ব্যবহৃত হয়েছে তবে তা অন্যদের কাছে কার্যকর প্রমাণিত হয়েছে regard


38
3 য় আর্গুমেন্টটি আসলে বাদ দেওয়া যেতে পারে এবং এটি একই সার্ভারে ডিফল্ট হবে।
হাকন

15
মনে রাখবেন যে db_to_rename এবং db_renamed শুধুমাত্র ক্ষেত্রে ক্ষেত্রে পৃথক হলে এটি কাজ করে না। সেই পরিস্থিতিতে আপনাকে একটি অস্থায়ী ডাটাবেস ব্যবহার করতে হবে। (আমি কেবল
সেবাস্তিয়ান এম

71
ওপি কর্তৃক প্রদত্ত সমাধান থেকে এটি কীভাবে আলাদা?
সালভাদোর ডালি

5
এই শুধু পার্থক্য তৃতীয় যুক্তি হচ্ছে প্রকৃত প্রশ্ন হিসাবে একই copyDatabaseপদ্ধতি
Gurbakhshish সিং

2
এটি হ'ল আসল প্রশ্নটির সাথে একই তাত্পর্য copyDatabaseপদ্ধতিতে তৃতীয় যুক্তি *, যা অপ্রয়োজনীয় এবং অতএব এটি আরও খারাপ সমাধান যা ওপি ইতিমধ্যে অবগত ছিল * * সিসি @ গুরুবাখশীসিংহ
ত্রিন্দজ

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তৈরি ছিল । আপনি আলাদা নাম দিয়ে এটি পুনরুদ্ধার করতে পারেন তা জানেন না। ধন্যবাদ!
দুশান্ত বাঙ্গাল

5
দ্রষ্টব্য: আপনি যদি --gzipসংরক্ষণাগার ব্যবহার করে তৈরি করেন তবে এটি কাজ করে না
দুশায়ন্ত বাঙ্গাল

9
এটি এখনই প্রস্তাবিত উপায়, যেহেতু db.copyDatabase()এখন
অবহেলিত

মনে নেই যে, --db( -d) যুক্তিটি নিজেই হ্রাস পেয়েছে। একটি অবমূল্যায়ন পার্টি কিছুটা চলছে, মনে হচ্ছে, দেওয়াও copyDatabaseচলে গেছে। আমি আমার নোটগুলি দিয়ে সার্ভার -701 পোক করেছি ।
amcgregor

28

দ্রষ্টব্য: আশা করি এটি সর্বশেষতম সংস্করণে পরিবর্তিত হয়েছে।

আপনি কোনও মঙ্গোডিবি ৪.০ মঙ্গোদ উদাহরণ (এফসিভি মান নির্বিশেষে) এবং একটি মঙ্গোডিবি ৩.৪ এবং পূর্ববর্তী মঙ্গোড উদাহরণগুলির মধ্যে অনুলিপি করতে পারবেন না। https://docs.mongodb.com/v4.0/reference/method/db.copyDatabase/

সতর্কতা : আরে লোকেরা ডাটাবেস অনুলিপি করার সময় কেবল সতর্কতা অবলম্বন করুন, যদি আপনি একক ডাটাবেসের অধীনে বিভিন্ন সংগ্রহকে গোলযোগ করতে চান না।

নীচে আপনাকে কীভাবে নাম পরিবর্তন করতে হবে তা দেখায়

> show dbs;
testing
games
movies

নাম পরিবর্তন করতে আপনি নিম্নলিখিত সিনট্যাক্স ব্যবহার করুন

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

উদাহরণ:

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

এখন আপনি নীচের উপায়ে নিরাপদে পুরাতন ডিবি মুছতে পারেন

use testing;

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

এখনই ভাবুন যদি আপনি বিদ্যমান ডাটাবেসের নামের সাথে নতুন ডাটাবেসটির নাম পরিবর্তন করার চেষ্টা করেন তবে কি হয়

উদাহরণ:

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

সুতরাং এই প্রসঙ্গে টেস্টিংয়ের সমস্ত সংগ্রহ (সারণী) চলচ্চিত্রের ডাটাবেসে অনুলিপি করা হবে ।



@ এমসিগ্রিগোর অবহিত করার জন্য ধন্যবাদ। আমি এর জন্য একটি মন্তব্য যুক্ত করেছি। আশা করি এটি কিছু সাহায্য করবে।
চান্নবীর হাকারি

8

যদিও মংডডব নাম পরিবর্তন করে ডেটাবেস কমান্ড সরবরাহ করে না, এটি r এনাম সংগ্রহ কমান্ড সরবরাহ করে , যা কেবল সংগ্রহের নামটিই পরিবর্তন করে না, পাশাপাশি ডাটাবেসের নামও পরিবর্তন করে।

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

এই কমান্ডের শুধুমাত্র মেটাডেটা পরিবর্তন, খরচ খুবই ছোট, আমরা কেবল অধীনস্থ সকল সংগ্রহের তর্ক প্রয়োজন db1, এর নাম পরিবর্তন করে রাখা db2পুনঃনামকরণ ডাটাবেস নাম অর্জন করা।
আপনি এই জেএস স্ক্রিপ্ট এ এটি করতে পারেন

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 সমান ।
amcgregor

1
খরচ হতে পারে বিশাল! docs.mongodb.com/manual/references/command/renameColલેક્/… যদি লক্ষ্য ডাটাবেস উত্স ডাটাবেসের সমান হয় তবে পুনর্নামকরণ সংকলন কেবল নাম স্থান পরিবর্তন করে। এটি একটি দ্রুত অপারেশন। যদি লক্ষ্য ডাটাবেস উত্স ডাটাবেস থেকে পৃথক হয়, পুনর্নবীকরণের সংগ্রহটি সংগ্রহের সমস্ত নথি উত্স সংগ্রহ থেকে লক্ষ্য সংগ্রহের অনুলিপি করে। সংগ্রহের আকারের উপর নির্ভর করে এটি শেষ হতে আরও বেশি সময় নিতে পারে।
নাগিলিজ

আপনার উত্তর পরিবর্তন করুন। আপনার উত্তরটি সহায়ক, কারণ এই আদেশটি দিয়ে একটি সংগ্রহ অন্য ডেটাবেসে স্থানান্তরিত করা সম্ভব। তবে এটি ভুল এবং এটি অন্যকে ভুল পথে চালিত করতে পারে।
নাগিলিজ

6

উপরের প্রক্রিয়াটি ধীর গতির, আপনি নীচের পদ্ধতিটি ব্যবহার করতে পারেন তবে আপনার সংগ্রহটি সংগ্রহ করে অন্য ডিবিতে স্থানান্তরিত করতে হবে।

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

দুর্দান্ত পরামর্শ আইএমএইচও। তবে, এটি লক্ষণীয় যে এটি আসল ডিবি থেকে স্থানটি মুক্ত করবে না তবে নামটি অনুলিপি করার চেয়ে অনেক দ্রুত হওয়া উচিত।
sirfz

1
এটি স্ক্র্যাচ করুন, এটি যাইহোক কোনও অনুলিপি করে (যেহেতু এটি স্থানটি সরিয়ে দেয় না, এটি আসলেই একটি সহজ নাম নয়) সুতরাং অনুলিপি এবং ড্রপের মাধ্যমে এই পদ্ধতির কোনও আসল সুবিধা নেই।
sirfz

5

ডাটাবেসগুলির নতুন নামকরণের কোনও ব্যবস্থা নেই। লেখার সময় বর্তমানে গৃহীত উত্তর মোটামুটি সঠিক এবং অজুহাত মূল প্রজেক্টের হিসেবে অফার কিছু মজার পটভূমি বিস্তারিত, কিন্তু আচরণ প্রতিলিপি নির্মাণ জন্য অফার কোনো পরামর্শ। অন্যান্য উত্তরগুলি নির্দেশ করে copyDatabase, যা এখন আর বিকল্প নয় কারণ কার্যকারিতাটি 4.0 এ মুছে ফেলা হয়েছে । আমি আমার নোট এবং অবিশ্বাসের সাথে সার্ভার -701 আপডেট করেছি । 🙃

সমতুল্য আচরণ জড়িত mongodumpএবং mongorestoreকিছুটা নাচের মধ্যে:

  1. "ডেটাস্পেসস" ব্যবহারের ক্ষেত্রে নোট তৈরি করে আপনার ডেটা রফতানি করুন। উদাহরণস্বরূপ, আমার ডেটাসেটগুলির একটিতে নেমস্পেসের সাথে আমার একটি সংগ্রহ রয়েছে byzmcbehoomrfjcs9vlj.Analytics- পরের ধাপে উপসর্গ ( আসলে ডাটাবেসের নাম ) প্রয়োজন হবে।

  2. আপনার ডেটা, সরবরাহ --nsFromএবং --nsToযুক্তিগুলি আমদানি করুন । ( ডকুমেন্টেশন। ) আরও উপরের সংবেদনশীল নামটি পুনরুদ্ধার করার জন্য আমার উপরের অনুমানমূলক (এবং অত্যন্ত অপঠনযোগ্য) উদাহরণ দিয়ে চালিয়ে যেতে:

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

কেউ কেউ --dbমংগেরস্টোরের পক্ষেও যুক্তি দেখিয়ে দিতে পারে, তবে এটিও অবহেলিত এবং বিএসওএন ফোল্ডার ব্যাকআপগুলিতে সম্পূর্ণ ভুলমূলক পরামর্শ দিয়ে " use --nsInclude instead" ব্যবহারের বিরুদ্ধে একটি সতর্কবার্তা ট্রিগার করে । উপরের নেমস্পেস অনুবাদটি --dbবিকল্পটির ব্যবহারের সমতুল্য এবং এটি ব্যবহারের জন্য সঠিক নেমস্পেস ম্যানিপুলেশন সেটআপ যা আমরা পুনরুদ্ধার করা হচ্ছে তা ফিল্টার করার চেষ্টা করছি না।


1
--nsFromএবং --nsToআমার জন্য কাজ। ধন্যবাদ!
ভড়গব শাহ

মঙ্গোডাম্প এনএসফ্রোম / টু-এর 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/

ডিবিতে সংযুক্ত

use DB_TobeRenamed

তারপর

db.dropDatabase()

তারপরে কমান্ড দিয়ে ডিবি পুনরুদ্ধার করুন।

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

2

আপনি যদি অ্যাডমিন ডাটাবেসে আপনার সমস্ত ডেটা রাখেন (তবে আপনার উচিত নয়) আপনি খেয়াল db.copyDatabase()করবেন না কারণ আপনার ব্যবহারকারীর জন্য প্রচুর সুযোগ-সুবিধাগুলি সম্ভবত আপনি দিতে চান না requires ম্যানুয়ালি ডাটাবেস অনুলিপি করার জন্য এখানে একটি স্ক্রিপ্ট রয়েছে:

use old_db
db.getCollectionNames().forEach(function(collName) {
    db[collName].find().forEach(function(d){
        db.getSiblingDB('new_db')[collName].insert(d); 
    }) 
});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.