你如何重命名MongoDB数据库?

时间:2012-02-08 21:35:40

标签: mongodb database

我的MongoDB数据库名称中有一个拼写错误,我正在寻找重命名数据库。

我可以copy并像这样删除...

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

是否有重命名数据库的命令?

10 个答案:

答案 0 :(得分:373)

你可以这样做:

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

编者注:这与问题本身使用的方法相同,但无论如何都证明对其他人有用。

答案 1 :(得分:180)

不,没有。见https://jira.mongodb.org/browse/SERVER-701

  

不幸的是,由于数据库元数据存储在原始(默认)存储引擎中的方式,这不是我们实现的简单功能。在MMAPv1文件中,描述每个集合和索引的命名空间(例如:dbName.collection)包含数据库名称,因此要重命名一组数据库文件,必须重写每个命名空间字符串。这会影响:

     
      
  • .ns文件
  •   
  • 集合的每个编号文件
  •   
  • 每个索引的命名空间
  •   
  • 每个集合和索引的内部唯一名称
  •   
  • system.namespaces和system.indexes(或将来的等价物)的内容
  •   
  • 我可能遗失的其他地方
  •   
     

这只是为了完成独立 mongod实例中单个数据库的重命名。对于副本集,需要在每个副本节点上完成上述操作,并且在每个节点上,引用此数据库的每个oplog条目都必须以某种方式无效或重写,然后如果它是分片群集,则还需要添加这些如果数据库是分片的,则更改为每个分片,并且配置服务器在名称空间中具有所有分片元数据及其全名。

     

在现场系统上绝对没有办法做到这一点。

     

要离线执行,需要重新编写每个数据库文件以容纳新名称,此时它将与当前“copydb”命令一样慢......

答案 2 :(得分:138)

替代解决方案:您可以转储数据库并以不同的名称还原该数据库。正如我所经历的那样,它比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/

答案 3 :(得分:23)

ALERT :如果您不想在单个数据库下搞乱不同的集合,请大家在复制数据库时要小心。

以下说明如何重命名

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

因此,在此背景下,测试的所有馆藏(表格)将被复制到电影数据库。

答案 4 :(得分:5)

上面的过程很慢,你可以使用下面的方法,但你需要按集合将集合移动到另一个数据库。

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

答案 5 :(得分:5)

从4.2版开始,copyDatabase已过时。从现在开始,我们应该使用:mongodumpmongorestore

假设我们有一个名为old_name的数据库,我们想将其重命名为new_name

首先,我们必须转储数据库:

mongodump --archive="old_name_dump.db" --db=old_name

如果您必须通过用户身份验证,请使用:

mongodump -u username --authenticationDatabase admin \
          --archive="old_name_dump.db" --db=old_name

现在,我们将数据库作为名为old_name_dump.db的文件转储。

要使用新名称恢复:

mongorestore --archive="old_name_dump.db" --nsFrom="old_name.*" --nsTo="new_name.*"

同样,如果您需要进行身份验证,请将以下参数添加到命令中:

-u username --authenticationDatabase admin 

参考:https://docs.mongodb.com/manual/release-notes/4.2-compatibility/#remove-support-for-the-copydb-and-clone-commands

答案 6 :(得分:2)

如果您将所有数据都放在管理数据库中(您不应该),您会发现db.copyDatabase()无法正常工作,因为您的用户需要很多权限可能不想给它。这是一个手动复制数据库的脚本:

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

答案 7 :(得分:2)

尽管Mongodb没有提供重命名数据库命令,但它提供了r ename Collection command,它不仅可以修改集合名称,还可以修改数据库名称。

db1

此命令仅修改元数据,代价很小,我们只需要遍历db2下的所有集合,将其重命名为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}); } 即可重命名数据库名称。
您可以在此Js脚本中完成

not exists

答案 8 :(得分:1)

没有重命名数据库的机制。 currently accepted answer at time of writing实际上是正确的,并且提供了有关上游借口的一些有趣的背景信息,但没有提供任何复制行为的建议。其他答案指向copyDatabase,它不再是the functionality has been removed in 4.0的选项。我已经更新了SERVER-701 with my notes和不确定性。 ?

等效行为涉及到mongodumpmongorestore的一段舞蹈:

  1. 导出数据,记下正在使用的“命名空间”。例如,在我的一个数据集上,我有一个名称空间为byzmcbehoomrfjcs9vlj.Analytics的集合-下一步将需要前缀(实际上是数据库名称)。

    < / li>
  2. 导入数据,并提供--nsFrom--nsTo参数。 (Documentation.)继续我上面的假设(非常不易理解)的示例,为了恢复为更有意义的名称,我调用:

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

有些人可能也指向mongorestore的--db参数,但是,该参数也已被弃用,并在非BSON文件夹备份上触发警告,提示“ use --nsInclude instead完全错误。 。上面的名称空间转换等同于使用--db选项,并且是正确的名称空间操作设置,因为我们不尝试过滤正在还原的内容。

答案 9 :(得分:0)

我尝试做。

db.copyDatabase('DB_toBeRenamed','Db_newName','host') 

并了解到,尽管它创建了备份或重命名数据库,但mongo社区已弃用了它。

WARNING: db.copyDatabase is deprecated. See http://dochub.mongodb.org/core/copydb-clone-deprecation
{
        "note" : "Support for the copydb command has been deprecated. See 
        http://dochub.mongodb.org/core/copydb-clone-deprecation",
        "ok" : 1
}

因此对上述方法不满意,我不得不使用以下命令进行本地转储

mongodump --host --db DB_TobeRenamed --out E://FileName/

已连接到Db。

use DB_TobeRenamed

然后

db.dropDatabase()

然后使用命令恢复数据库。

mongorestore -host hostName -d Db_NewName E://FileName/