Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

  ПРИМЕЧАНИЕ. Надеюсь, это изменило последнюю версию.

Вы не можете копировать данные между экземпляром MongoDB 4.0 mongod (независимо от значения FCV) и MongoDB 3.4 и более ранний экземпляр Mongod. 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'); 

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

Ответ 5

Хотя Mongodb не предоставляет команду переименования базы данных, она предоставляет командуколлекции r, которая не только изменяет имя коллекции, но и имя базы данных.

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

Ответ 6

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

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

Ответ 7

Если вы поместите все свои данные в базу данных администратора (вы не должны этого 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); 
    }) 
});

Ответ 8

Не существует механизма для переименования баз данных. в настоящее время принятый ответ на момент написания является фактически правильным и предлагает некоторые интересные подробные сведения о предлоге выше по течению, но не предлагает никаких предложений для воспроизведения поведения. Другие ответы указывают на copyDatabase, который больше не является опцией, поскольку функциональность была удалена в 4.0. Я обновил SERVER-701 с моими заметками и недоверием. 🙃

Эквивалентное поведение вовлекает mongodump и mongorestore в немного танца:

  1. Экспортируйте свои данные, отмечая используемые "пространства имен". Например, в одном из моих наборов данных у меня есть коллекция с пространством имен byzmcbehoomrfjcs9vlj.Analytics - этот префикс (фактически имя базы данных) понадобится на следующем шаге.

  2. Импортируйте свои данные, указав аргументы --nsFrom и --nsTo. (Документация.) Продолжая мой приведенный выше гипотетический (и крайне нечитаемый) пример, чтобы восстановить более чувственное имя, я призываю:

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

Некоторые могут также указать на аргумент --db для mongorestore, однако это также устарело и выдает предупреждение против использования в резервных копиях папок, не относящихся к BSON, с совершенно ошибочным предложением "use --nsInclude instead". Приведенная выше трансляция пространства имен эквивалентна использованию опции --db и является правильной настройкой манипуляции пространством имен, поскольку мы не пытаемся фильтровать то, что восстанавливается.