¿Cómo cambiar el nombre de una base de datos MongoDB?


Hay un error tipográfico en el nombre de mi base de datos MongoDB y estoy buscando cambiar el nombre de la base de datos.

Puedo copiar y eliminar así...

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

¿Hay un comando para cambiar el nombre de una base de datos?

Author: Community, 2012-02-09

6 answers

No, no lo hay. Ver https://jira.mongodb.org/browse/SERVER-701

Desafortunadamente, esta no es una característica fácil de implementar debido a la forma en que los metadatos de la base de datos se almacenan en el motor de almacenamiento original (predeterminado). En los archivos MMAPv1, el espacio de nombres (por ejemplo: dbName.colección) que describe cada colección e índice incluye el nombre de la base de datos, por lo que para cambiar el nombre de un conjunto de archivos de base de datos, cada cadena de espacio de nombres tendría que ser reescrita. Este impactos:

  • el.ns file
  • cada archivo numerado de la colección
  • el espacio de nombres para cada índice
  • nombres únicos internos de cada colección e índice
  • contenido del sistema.espacios de nombres y sistema.índices (o sus equivalentes en el futuro)
  • otros lugares que pueden faltar

Esto es solo para lograr un cambio de nombre de una sola base de datos en una instancia de mongod independiente. Para la réplica fija el antedicho tendría que hacerse en cada nodo de réplica, además en cada nodo cada entrada oplog que se refiere a esta base de datos tendría que ser de alguna manera invalidada o reescrita, y luego si se trata de un clúster fragmentado, uno también necesita agregar estos cambios a cada fragmento si la base de datos está fragmentada, además los servidores de configuración tienen todos los metadatos del fragmento en términos de espacios de nombres con sus nombres completos.

No habría absolutamente ninguna manera de hacer esto en un sistema en vivo.

Para hacerlo sin conexión, se requeriría reescribir cada archivo de base de datos para acomodar el nuevo nombre, y en ese momento sería tan lento como el comando "copydb" actual...

 166
Author: pingw33n,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-21 15:46:42

Usted podría hacer esto:

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

Nota editorial: este es el mismo enfoque utilizado en la pregunta en sí, pero ha demostrado ser útil para otros a pesar de todo.

 348
Author: bzmw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-11 00:06:16

Solución alternativa: puede volcar su base de datos y restaurarla con un nombre diferente. Como he experimentado es mucho más rápido 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 /

 116
Author: tomako,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-04 11:53:34

ALERT : Hey amigos solo tengan cuidado al copiar la base de datos, si no quieren estropear las diferentes colecciones bajo una sola base de datos.

A continuación se muestra cómo cambiar el nombre de

> show dbs;
testing
games
movies

Para cambiar el nombre utilice la siguiente sintaxis

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

Ejemplo:

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

Ahora puede eliminar de forma segura la base de datos antigua de la siguiente manera

use testing;

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

Ahora solo piense en lo que sucede si intenta cambiar el nombre del nuevo nombre de la base de datos con la base de datos existente nombre

Ejemplo:

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

Así que en este contexto todas las colecciones (tablas) de testing se copiarán a la base de datos de movies.

 12
Author: Channaveer Hakari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-22 05:09:55

El proceso anterior es lento,puede usar el siguiente método, pero necesita mover colección por colección a otra base de datos.

use admin
db.runCommand({renameCollection: "[db_old_name].[collection_name]", to: "[db_new_name].[collection_name]"})
 4
Author: madan ram,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-14 07:56:19

En el caso de que ponga todos sus datos en la base de datos de administración (no debería), notará que db.copyDatabase() no funcionará porque su usuario requiere muchos privilegios que probablemente no desee darle. Aquí hay un script para copiar la base de datos manualmente:

use old_db
db.getCollectionNames().forEach(function(collName) {
    db[collName].find().forEach(function(d){
        db.getSiblingDB('new_db')[collName].insert(d); 
    }) 
});
 2
Author: François Guthmann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-22 05:07:34