602 votes

Comment renommer une base de données MongoDB ?

Il y a une faute de frappe dans le nom de ma base de données MongoDB et je cherche à la renommer.

Je peux copie et supprimer comme ça...

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

Existe-t-il une commande permettant de renommer une base de données ?

8 votes

de mongo 4.2 même copyDatabase est également déprécié

442voto

BZMWillemsen Points 1104

Tu pourrais faire ça :

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

Note éditoriale : il s'agit de la même approche que celle utilisée dans la question elle-même, mais elle s'est avérée utile pour d'autres personnes.

0 votes

La réponse est confuse en ce qui concerne le 3ème argument de copyDatabase . Voir le Commandes de copie de base de données MongoDB pour être clair.

0 votes

Pour le 3ème argument, je suggère de mettre "localhost". Modifié pour plus de clarté

45 votes

Le troisième argument peut être omis, et le même serveur sera utilisé par défaut.

345voto

tomako Points 171

Solution alternative : vous pouvez vider votre base de données et la restaurer sous un autre nom. 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/


Il s'agit de la version officielle actuelle approche recommandée pour les renommages de bases de données, étant donné que copyDatabase a été supprimé dans MongoDB 4.2 :

La commande "copydb" est obsolète, veuillez utiliser ces deux commandes à la place :

  1. mongodump (pour sauvegarder les données)
  2. mongorestore (pour récupérer les données de mongodump dans un nouvel espace de noms)

7 votes

C'est plus rapide et comme "effet secondaire", votre base de données est également compactée.

1 votes

C'est génial ! J'avais déjà un mongodump créé. Je ne savais pas qu'on pouvait le restaurer avec un nom différent. Merci !

7 votes

REMARQUE : Cela ne fonctionne pas si vous utilisez l'option --gzip et créer une archive

238voto

pingw33n Points 6428

Non, il n'y en a pas. Voir https://jira.mongodb.org/browse/SERVER-701

Malheureusement, ce n'est pas une fonctionnalité simple à mettre en œuvre pour nous en raison de la façon dont les métadonnées de base de données sont stockées dans le moteur de stockage original (par défaut). Dans les fichiers MMAPv1, l'espace de noms (par exemple : dbName.collection) qui décrit chaque collection et chaque index comprend 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. Cela a un impact :

  • le fichier .ns
  • chaque fichier numéroté de la collection
  • l'espace de nom pour chaque index
  • les noms uniques internes de chaque collection et index
  • le contenu de system.namespaces et system.indexes (ou leurs équivalents dans le futur)
  • d'autres endroits que j'ai peut-être oubliés

Il s'agit simplement d'effectuer le renommage d'une seule base de données dans un fichier de type autonome instance mongole. Pour les ensembles de répliques, ce qui précède doit être fait sur chaque nœud de réplique, et sur chaque nœud, chaque entrée oplog qui fait référence à cette base de données doit être d'une manière ou d'une autre invalidée ou réécrite, et ensuite, s'il s'agit d'un cluster sharded, il faut également ajouter ces changements à chaque shard si la base de données est sharded, et les serveurs de configuration ont toutes les métadonnées shard en termes d'espaces de noms avec leurs noms complets.

Il n'y aurait absolument aucun moyen de faire cela sur un système vivant.

Pour le faire hors ligne, il faudrait réécrire chaque fichier de base de données pour l'adapter au nouveau nom, et à ce stade, ce serait aussi lent que la commande "copydb" actuelle...

6 votes

Ce ticket est ouvert depuis très longtemps. J'ai ajouté mon vote de peu d'importance à la liste déjà longue.

5 votes

De la manière dont ils ont construit et expliqué la base de données, il semble impossible de la renommer - il faudrait peut-être une toute nouvelle architecture. Cela semble être un gros oubli, mais tout est juste en amour, en guerre et dans le développement de logiciels.

0 votes

MongoDB devrait donc avoir une commande qui appelle deux fonctions, copy et drop ? Je ne vois pas de raison majeure d'avoir cette commande unique. Mais cela pourrait être agréable pour certains.

32voto

Channaveer Hakari Points 1324

NOTE : J'espère que cela a changé dans la dernière version.

Vous ne pouvez pas copier de données entre une instance MongoDB 4.0 (indépendamment de la valeur FCV) et une instance MongoDB 3.4 ou antérieure. de la valeur FCV) et une instance MongoDB 3.4 ou antérieure. https://docs.mongodb.com/v4.0/reference/method/db.copyDatabase/

ALERTE : Hé les gars, faites attention en copiant la base de données, si vous ne voulez pas mélanger les différentes collections sous une seule base de données.

L'exemple suivant vous montre comment renommer

> show dbs;
testing
games
movies

Pour renommer, utilisez la syntaxe suivante

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

Exemple :

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

Vous pouvez maintenant supprimer l'ancienne base de données en toute sécurité 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 nom de la nouvelle base de données avec le nom de la base de données existante.

Exemple :

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

Ainsi, dans ce contexte, toutes les collections (tables) de tests sera copié dans films base de données.

4 votes

0 votes

@amcgregor merci de me le signaler. J'ai ajouté un commentaire à ce sujet. J'espère que cela aidera quelqu'un.

1 votes

db.copyDatabase n'est plus sur mongodb 4.4

23voto

HbnKing Points 681

Bien que Mongodb ne fournisse pas la commande rename Database, il fournit la commande r ename Commande de collecte qui modifie non seulement le nom de la collection, mais aussi le nom de la base de données.

{ renameCollection: "<source_namespace>", to: "<target_namespace>", dropTarget: <true|false>  writeConcern: <document> }

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

Cette commande ne modifie que les métadonnées, le coût est très faible, il suffit de parcourir toutes les collections sous le nom de db1 renommé en db2 pour parvenir à renommer le nom de la base de données.
vous pouvez le faire dans ce Js script

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

Faites attention lorsque vous utilisez cette commande

renameCollection a des répercussions différentes sur les performances selon l'espace de noms cible.

Si la base de données cible est la même que la base de données source, renameCollection change simplement l'espace de noms. Il s'agit d'une opération opération.

Si la base de données cible diffère de la base de données source, renameCollection copie tous les documents de la collection source vers la collection cible. Selon la taille de la collection, cette opération peut prendre plus de temps.

0 votes

Qu'en est-il des index et autres métadonnées, sont-ils conservés ou perdus ?

0 votes

@UDB Très probablement conservé. "Renommer une collection" est un transformation de l'espace de nom essentiellement votre collection nommée foo au sein de la bar a un espace de nom de bar.foo . L'indice sur _id a donc l'espace de nom bar.foo._id_ . Le renommage de la collection (devrait) effectuer une recherche et un remplacement de préfixe sur tous les espaces de noms dont il a connaissance, de manière similaire à la fonction --nsFrom y --nsTo options pour mongorestore .

4 votes

Le coût peut être ÉNORME ! docs.mongodb.com/manual/reference/command/renameCollection/ Si la base de données cible est la même que la base de données source, renameCollection modifie simplement l'espace de noms. Il s'agit d'une opération rapide. Si la base de données cible est différente de la base de données source, renameCollection copie tous les documents de la collection source vers la collection cible. Selon la taille de la collection, cette opération peut prendre plus de temps.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X