首页 文章

你如何重命名MongoDB数据库?

提问于
浏览
415

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

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

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

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

6 回答

  • 18

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

    遗憾的是,由于数据库元数据存储在原始(默认)存储引擎中的方式,这不是我们实现的简单功能 . 在MMAPv1文件中,描述每个集合和索引的名称空间(例如:dbName.collection)包括数据库名称,因此要重命名一组数据库文件,必须重写每个单独的名称空间字符串 . 这会影响:.ns文件集合的每个编号文件每个索引的名称空间每个集合的内部唯一名称以及system.namespaces和system.indexes(或将来它们的等价物)的索引内容我可能会丢失的其他位置这只是为了在独立的mongod实例中完成单个数据库的重命名 . 对于副本集,上面需要在每个副本节点上完成,而且在每个节点上,引用此数据库的每个oplog条目都必须以某种方式无效或重写,然后如果它是分片群集,则还需要添加这些如果数据库是分片的,则更改为每个分片,并且配置服务器具有名称空间及其全名的所有分片元数据 . 在实时系统上绝对没有办法做到这一点 . 要离线执行,需要重新编写每个数据库文件以容纳新名称,此时它将与当前“copydb”命令一样慢...

  • 2

    你可以这样做:

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

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

  • 4

    替代解决方案:您可以转储数据库并以不同的名称还原它 . 因为我've experienced it'比 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/

  • 362

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

    The following shows you how to rename

    > 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
    

    Now just think what happens if you try renaming the new database name with existing database name

    例:

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

    因此,在此上下文中, testing 的所有集合(表)将被复制到 movies 数据库 .

  • 124

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

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

    在您将所有数据放入管理数据库的情况下(您不应该 db.copyDatabase() 通知 db.copyDatabase() 赢得't work because your user requires a lot of privileges you probably don' t想要给它 . 这是一个手动复制数据库的脚本:

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

相关问题