Comment renommez-vous une base de données MongoDB?
Il y a une faute de frappe dans mon nom de base de données MongoDB et je cherche à renommer la base de données.
Je peux copier et supprimer comme ça...
db.copyDatabase('old_name', 'new_name');
use old_name
db.dropDatabase();
Est-il une commande pour renommer une base de données?
6 réponses
Non, il n'y en a pas. voir https://jira.mongodb.org/browse/SERVER-701
Malheureusement, ce n'est pas une fonctionnalité simple à implémenter en raison de la façon dont les métadonnées de la base de données sont stockées dans le moteur de stockage d'origine (par défaut). Dans les fichiers MMAPv1, l'espace de noms (par exemple: dbName.collection) qui décrit chaque collection et index inclut le nom de la base de données, donc pour renommer un ensemble de fichiers de base de données, chaque chaîne d'espace de noms devrait être réécrite. Ce impacts:
- le .fichier ns
- chaque fichier numéroté pour la collection
- l'espace de noms pour chaque index
- noms uniques internes de chaque collection et index
- contenu du système.les espaces de noms et de système.indices (ou leurs équivalents à l'avenir)
- d'autres endroits me manquent peut-être
C'est juste pour effectuer un renommage d'une seule base de données dans une instance mongod autonome . Pour replica définit ce qui précède devrait être fait sur chaque nœud de réplique, plus sur chaque nœud chaque entrée oplog qui fait référence à cette base de données devrait être invalidée ou réécrite, et si c'est un cluster partagé, il faut également ajouter ces modifications à chaque fragment si la base de données est fragmentée, plus les serveurs de configuration ont toutes les métadonnées de fragment en termes d'espaces de noms avec leurs noms complets.
Il n'y aurait absolument aucun moyen de le faire sur un système live.
Pour le faire hors ligne, il faudrait réécrire chaque fichier de base de données pour accueillir le nouveau nom, et à ce stade, il serait aussi lent que la commande "copydb" actuelle...
Vous pouvez faire ceci:
db.copyDatabase("db_to_rename","db_renamed","localhost")
use db_to_rename
db.dropDatabase();
Note éditoriale: c'est la même approche utilisée dans la question elle-même, mais elle s'est avérée utile aux autres.
Solution Alternative: vous pouvez vider votre base de données et la restaurer sous un nom différent. Comme je l'ai expérimenté, c'est beaucoup plus rapide que 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/
ALERT : Hey les gens soyez prudent lors de la copie de la base de données, si vous ne voulez pas gâcher les différentes collections sous une seule base de données.
Le suivant vous montre comment renommer
> show dbs;
testing
games
movies
Renommer vous utilisez la syntaxe suivante
db.copyDatabase("old db name","new db name")
Exemple:
db.copyDatabase('testing','newTesting')
Maintenant, vous pouvez supprimer l'ancienne base de données de la manière suivante
use testing;
db.dropDatabase(); //Here the db **testing** is deleted successfully
Maintenant pensez à ce qui se passe si vous essayez de renommer le nouveau nom de base de données avec la base de données existante nom
Exemple:
db.copyDatabase('testing','movies');
Donc, dans ce contexte, toutes les collections (tableaux) de test sera copié dans films de la base de données.
Le processus ci-dessus est lent,vous pouvez utiliser la méthode ci-dessous mais vous devez déplacer collection Par collection vers une autre base de données.
use admin
db.runCommand({renameCollection: "[db_old_name].[collection_name]", to: "[db_new_name].[collection_name]"})
Dans le cas où vous mettez toutes vos données dans la base de données admin (Vous ne devriez pas), vous remarquerez que db.copyDatabase()
ne fonctionnera pas car votre utilisateur nécessite beaucoup de privilèges que vous ne voulez probablement pas lui donner. Voici un script pour copier la base de données manuellement:
use old_db
db.getCollectionNames().forEach(function(collName) {
db[collName].find().forEach(function(d){
db.getSiblingDB('new_db')[collName].insert(d);
})
});