wake-up-neo.com

Wie benennt man eine MongoDB-Datenbank um?

Mein MongoDB-Datenbankname enthält einen Tippfehler, und ich möchte die Datenbank umbenennen.

Ich kann kopieren und so löschen ...

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

Gibt es einen Befehl zum Umbenennen einer Datenbank?

450
Brian Hempel

Nein, gibt es nicht. Siehe https://jira.mongodb.org/browse/SERVER-701

Leider ist diese Funktion für uns nicht einfach zu implementieren, da die Datenbank-Metadaten in der ursprünglichen (Standard-) Speicher-Engine gespeichert sind. In MMAPv1-Dateien enthält der Namespace (z. B. dbName.collection), der jede einzelne Collection und jeden einzelnen Index beschreibt, den Datenbanknamen. Um einen Satz von Datenbankdateien umzubenennen, muss also jede einzelne Namespace-Zeichenfolge neu geschrieben werden. Dies wirkt sich aus auf:

  • die .ns Datei
  • jede einzelne nummerierte Datei für die Sammlung
  • der Namespace für jeden Index
  • interne eindeutige Namen für jede Sammlung und jeden Index
  • inhalt von system.namespaces und system.indexes (oder deren Entsprechungen in der Zukunft)
  • andere Orte, an denen ich vermisse

Dies dient nur dazu, eine einzelne Datenbank in einer eigenständigen mongod-Instanz umzubenennen. Für Replikatgruppen müssten die obigen Schritte auf jedem Replikatknoten ausgeführt werden, und auf jedem Knoten müsste jeder einzelne Oplog-Eintrag, der auf diese Datenbank verweist, in irgendeiner Weise ungültig gemacht oder neu geschrieben werden. Wenn es sich dann um einen Sharded-Cluster handelt, müssen diese ebenfalls hinzugefügt werden Änderungen an jedem Shard, wenn die Datenbank sharded ist, und die Konfigurationsserver verfügen über alle Shard-Metadaten in Form von Namespaces mit ihren vollständigen Namen.

Auf einem Live-System wäre dies absolut unmöglich.

Um es offline zu machen, müsste jede einzelne Datenbankdatei neu geschrieben werden, um den neuen Namen aufzunehmen, und an diesem Punkt wäre es so langsam wie der aktuelle Befehl "copydb" ...

187
pingw33n

Sie könnten dies tun:

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

Anmerkung der Redaktion: Dies ist derselbe Ansatz, der in der Frage selbst verwendet wurde, der sich jedoch für andere als nützlich erwiesen hat.

381
bzmw

Alternative Lösung: Sie können Ihre Datenbank sichern und diese unter einem anderen Namen wiederherstellen. Wie ich erfahren habe, ist es viel schneller als 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/

145
tomako

ALERT : Hey Leute, seid nur vorsichtig beim Kopieren der Datenbank, wenn ihr nicht die verschiedenen Sammlungen unter einer einzigen Datenbank durcheinander bringen wollt.

Das Folgende zeigt Ihnen, wie Sie umbenennen

> show dbs;
testing
games
movies

Zum Umbenennen verwenden Sie die folgende Syntax

db.copyDatabase("old db name","new db name")

Beispiel:

db.copyDatabase('testing','newTesting')

Jetzt können Sie die alte Datenbank auf folgende Weise sicher löschen

use testing;

db.dropDatabase(); //Here the db **testing** is deleted successfully

Nun stellen Sie sich vor, was passiert, wenn Sie versuchen, den neuen Datenbanknamen mit dem vorhandenen Datenbanknamen umzubenennen.

Beispiel:

db.copyDatabase('testing','movies'); 

In diesem Zusammenhang werden also alle Sammlungen (Tabellen) von testing in die movies -Datenbank kopiert.

25

Der obige Vorgang ist langsam. Sie können die folgende Methode verwenden, müssen jedoch die Auflistung nach Auflistung in eine andere Datenbank verschieben.

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

Obwohl Mongodb den Befehl zum Umbenennen der Datenbank nicht bereitstellt, gibt es den Befehl r ename Collection , mit dem nicht nur der Name der Sammlung, sondern auch der Name der Datenbank geändert wird.

db.adminCommand({renameCollection: "db1.test1", to: "db2.test2"})

Dieser Befehl ändert nur die Metadaten, die Kosten sind sehr gering, wir müssen nur alle Sammlungen unter db1, umbenannt in db2 zum Umbenennen des Datenbanknamens.
Sie können es in diesem Js-Skript tun

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

Wenn Sie alle Ihre Daten in die Admin-Datenbank stellen (sollten Sie nicht), werden Sie feststellen, dass db.copyDatabase() nicht funktioniert, da Ihr Benutzer viele Berechtigungen benötigt, die Sie wahrscheinlich nicht vergeben möchten es. Hier ist ein Skript zum manuellen Kopieren der Datenbank:

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