提问



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


我可以像这样复制和删除... [13]


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


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

最佳参考


不,没有。请参阅https://jira.mongodb.org/browse/SERVER-701 [14]



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

  
  

      
  • .ns文件

  •   
  • 集合的每个编号文件

  •   
  • 每个索引的命名空间

  •   
  • 每个集合和索引的内部唯一名称

  •   
  • system.namespaces和system.indexes(或将来的等价物)的内容

  •   
  • 我可能遗失的其他地方

  •   

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

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

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


其它参考1


你可以这样做:


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


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

其它参考2


替代解决方案:您可以转储数据库并以不同的名称还原它。因为我经历过它比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/[15]

其它参考3


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


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


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

其它参考5


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


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