Как переименовать базу данных MongoDB? - PullRequest
444 голосов
/ 09 февраля 2012

В моем имени базы данных MongoDB есть опечатка, и я хочу переименовать базу данных.

Я могу скопировать и удалить, как это ...1007 * Есть ли команда для переименования базы данных?

Ответы [ 7 ]

377 голосов
/ 26 июля 2012

Вы можете сделать это:

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

От редакции. Это тот же подход, который использовался в самом вопросе, но, несмотря на это, оказался полезным для других.

184 голосов
/ 09 февраля 2012

Нет, нет. Смотри https://jira.mongodb.org/browse/SERVER-701

К сожалению, это не простая функция для нас, чтобы реализовать из-за способа, которым метаданные базы данных хранятся в исходном (по умолчанию) механизме хранения. В файлах MMAPv1 пространство имен (например, dbName.collection), которое описывает каждую отдельную коллекцию и индекс, включает имя базы данных, поэтому для переименования набора файлов базы данных каждую строку пространства имен необходимо переписать. Это влияет:

  • .ns файл
  • каждый пронумерованный файл для коллекции
  • пространство имен для каждого индекса
  • внутренние уникальные имена каждой коллекции и индекса
  • содержимое system.namespaces и system.indexes (или их эквивалентов в будущем)
  • другие места, которые я могу пропустить

Это просто для переименования одной базы данных в автономном экземпляре mongod. Для наборов реплик вышеупомянутое должно быть сделано на каждом узле реплики, плюс на каждом узле каждая запись оплога, которая ссылается на эту базу данных, должна быть каким-то образом признана недействительной или переписана, и затем, если это кластер с разделением на сегменты, также необходимо добавить изменяется для каждого сегмента, если база данных сегментирована, плюс серверы конфигурации имеют все метаданные сегмента в терминах пространств имен с их полными именами.

Не было бы абсолютно никакого способа сделать это в реальной системе.

Чтобы сделать это в автономном режиме, потребуется переписать каждый файл базы данных для размещения нового имени, и в этот момент это будет так же медленно, как текущая команда "copydb" ...

142 голосов
/ 04 апреля 2014

Альтернативное решение: вы можете сбросить свою базу данных и восстановить ее под другим именем.Как я понял, это гораздо быстрее, чем 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/

24 голосов
/ 08 июля 2017

ALERT : Эй, ребята, будьте осторожны при копировании базы данных, если вы не хотите путать разные коллекции в одной базе данных.

Ниже показано, как переименовать

> 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

Теперь просто подумайте, что произойдет, если вы попытаетесь переименовать новое имя базы данных в существующее имя базы данных

* * 1 022 Пример: * 1 023 *
db.copyDatabase('testing','movies'); 

Таким образом, в этом контексте все коллекции (таблицы) тестирования будут скопированы в фильмы базу данных.

5 голосов
/ 14 июля 2015

Вышеописанный процесс медленный, вы можете использовать метод ниже, но вам нужно переместить сбор за сбором в другую базу данных.

use admin
db.runCommand({renameCollection: "[db_old_name].[collection_name]", to: "[db_new_name].[collection_name]"})
2 голосов
/ 18 декабря 2018

Хотя 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});
}
2 голосов
/ 22 января 2018

Если вы поместите все свои данные в базу данных администратора (вы не должны этого делать), вы заметите, что db.copyDatabase() не будет работать, потому что вашему пользователю требуются многие привилегии, которые вы, вероятно, не хотите им предоставлять,Вот скрипт для копирования базы данных вручную:

use old_db
db.getCollectionNames().forEach(function(collName) {
    db[collName].find().forEach(function(d){
        db.getSiblingDB('new_db')[collName].insert(d); 
    }) 
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...