Как переименовать базу данных MongoDB?

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

Я могу скопировать и удалить так...

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

есть ли команда для переименования базы данных?

6 ответов


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

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

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

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

не было бы абсолютно никакой возможности сделать это на живой системе.

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


вы могли бы сделать это:

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

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


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


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

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

> 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'); 

в этом контексте все коллекции (таблицы)тестирование будет скопировано в фильмы


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

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

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

use old_db
db.getCollectionNames().forEach(function(collName) {
    db[collName].find().forEach(function(d){
        db.getSiblingDB('new_db')[collName].insert(d); 
    }) 
});