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

416

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

Я могу copy и удалить так...

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

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

Теги:
database

7 ответов

181
Лучший ответ

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

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

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

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

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

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

  • 2
    Этот билет был открыт очень давно. Я добавил свой менее важный голос в уже длинный список.
  • 4
    То, как они построили БД и объяснили это, переименование кажется невозможным - может потребоваться совершенно новая архитектура. Похоже, большой недосмотр, но все справедливо в любви, войне и разработке программного обеспечения.
Показать ещё 2 комментария
363

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

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

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

  • 0
    Ответ сбивает с толку в отношении третьего аргумента copyDatabase . Посмотрите Команды MongoDB Copy Database для прояснения ситуации.
  • 0
    Для третьего аргумента я предлагаю поставить "localhost". Отредактировано для ясности
Показать ещё 11 комментариев
124

Альтернативное решение: вы можете сбросить свой 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/

  • 0
    Помогает мне много !!
  • 5
    Это быстрее и, как «побочный эффект», ваша база данных также сжимается.
Показать ещё 4 комментария
19

ВНИМАНИЕ: Привет, ребята, будьте осторожны при копировании базы данных, если вы не хотите путать разные коллекции в одной базе данных.

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

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

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

4

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

use admin
db.runCommand({renameCollection: "[db_old_name].[collection_name]", to: "[db_new_name].[collection_name]"})
  • 0
    Отличное предложение ИМХО. Однако стоит отметить, что это не освободит пространство от исходной БД, но переименование должно быть намного быстрее, чем копирование данных.
  • 0
    Поцарапайте это, он все равно делает копию (поскольку он не удаляет пробел, это не просто переименование), так что нет никакого реального преимущества для этого метода по сравнению с копированием и удалением.
2

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

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

Хотя 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});
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню