У моєму імені бази даних 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.names та system.indexes (або їх еквіваленти в майбутньому)
- інших місць, які мені можуть бути відсутніми
Це просто для перейменування єдиної бази даних в окремий екземпляр mongod. Для наборів реплік вищезазначене потрібно робити на кожному вузлі репліки, плюс на кожному вузлі кожен окремий запис oplog, який посилається на цю базу даних, повинен бути якось недійсним або переписаним, а потім, якщо це кладений кластер, потрібно також додати ці змінюється на кожен фрагмент, якщо БД є шарованою, плюс сервери конфігурації мають усі метадані осколки з точки зору просторів імен з їх повними іменами.
Не було б абсолютно ніякого способу зробити це в прямому ефірі.
Для цього в режимі офлайн потрібно буде переписати кожен файл баз даних, щоб вмістити нове ім'я, і в цей момент це буде так само повільно, як і поточна команда "copydb" ...
Ви можете це зробити:
db.copyDatabase("db_to_rename","db_renamed","localhost")
use db_to_rename
db.dropDatabase();
Редакційна примітка: це той самий підхід, який застосовується в самому питанні, але виявився корисним для інших незалежно.
copyDatabase
методі
copyDatabase
методі *, який є непотрібним, а отже, гіршим рішенням, про яке вже знала ОП. * cc @GurbakhshishSingh
Альтернативне рішення: ви можете скинути db і відновити його під іншою назвою. Як я пережив, це набагато швидше, ніж 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
створене. Ви не знали, що можете відновити його з іншою назвою. Дякую!
--gzip
та створюєте архів
db.copyDatabase()
тепер застарілий
--db
( -d
) сам по собі також застарів. Здійснюється дещо депресійна вечірка, здається, дана copyDatabase
також пішла. Я ткнув СЕРВЕР-701 зі своїми замітками .
ПРИМІТКА. Сподіваємось, це змінилося в останній версії.
Ви не можете скопіювати дані між монго-екземпляром MongoDB 4.0 (незалежно від значення 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');
Отже в цьому контексті всі колекції (таблиці) тестування будуть скопійовані в базу даних фільмів .
Хоча Mongodb не надає команду База даних перейменувати, вона надає команду колекції r ename Collection , яка не лише модифікує ім'я колекції, але і змінює ім'я бази даних.
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')
і дізнався, що це було знято з боку спільноти mongo, хоча створило резервну копію або перейменував БД.
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
також застарілі