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

我可以像这样复制和删除…

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

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


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

Unfortunately, this is not an simple feature for us to implement due to the way that database metadata is stored in the original (default) storage engine. In MMAPv1 files, the namespace (e.g.: dbName.collection) that describes every single collection and index includes the database name, so to rename a set of database files, every single namespace string would have to be rewritten. This impacts: the .ns file every single numbered file for the collection the namespace for every index internal unique names of each collection and index contents of system.namespaces and system.indexes (or their equivalents in the future) other locations I may be missing This is just to accomplish a rename of a single database in a standalone mongod instance. For replica sets the above would need to be done on every replica node, plus on each node every single oplog entry that refers this database would have to be somehow invalidated or rewritten, and then if it's a sharded cluster, one also needs to add these changes to every shard if the DB is sharded, plus the config servers have all the shard metadata in terms of namespaces with their full names. There would be absolutely no way to do this on a live system. To do it offline, it would require re-writing every single database file to accommodate the new name, and at that point it would be as slow as the current "copydb" command...


你可以这样做,如果你使用MongoDB < 4.2 (ref):

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

编者按:这与问题本身使用的方法相同,但已被证明对其他人有用。


替代解决方案:您可以转储您的数据库,并恢复到不同的名称。根据我的经验,它比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/


这是目前官方推荐的数据库重命名方法,因为copyDatabase在MongoDB 4.2中被删除了:

"copydb"命令已弃用,请使用以下两个命令: mongodb(用于备份数据) Mongorestore(将数据从mongodb恢复到一个新的命名空间)


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

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

注意:希望在最新版本中有所改变。 不能在MongoDB 4.0 mongod实例之间复制数据 FCV值)和MongoDB 3.4和更早的mongod实例。 https://docs.mongodb.com/v4.0/reference/method/db.copyDatabase/

警告:嘿,伙计们,在复制数据库时要小心,如果你不想在一个数据库下搞砸不同的集合。

下面展示了如何重命名

> show dbs;
testing
games
movies

要重命名,请使用以下语法

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

例子:

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

现在,您可以通过以下方式安全地删除旧的db

use testing;

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

现在,如果尝试用现有数据库名称重命名新数据库名称,会发生什么情况

例子:

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

因此,在这种情况下,所有的测试集合(表)将被复制到电影数据库。


在将所有数据放入管理数据库的情况下(您不应该这样做),您将注意到db.copyDatabase()将不起作用,因为您的用户需要许多特权,而您可能不想给予它。下面是一个手动复制数据库的脚本:

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

尽管Mongodb没有提供rename Database命令,但它提供了rename Collection命令,该命令不仅修改了集合名称,还修改了数据库名称。

{ renameCollection: "<source_namespace>", to: "<target_namespace>", dropTarget: <true|false>  writeConcern: <document> }
db.adminCommand({renameCollection: "db1.test1", to: "db2.test2"})

此命令只修改元数据,成本非常小,只需要遍历db1下的所有集合,重命名为db2即可实现重命名数据库名称。 你可以在这个Js脚本中完成

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

请谨慎使用该命令

renameCollection具有不同的性能影响,具体取决于目标名称空间。 如果目标数据库与源数据库相同,则 renameCollection只是更改名称空间。这是一个快速的 操作。 如果目标数据库与源数据库不同, renameCollection将源集合中的所有文档复制到 目标集合。根据集合的大小,这个 可能需要更长的时间才能完成。


我试过了。

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

然后才知道它已经被mongo社区弃用了,尽管它创建了备份或重命名了DB。

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/

从4.2版开始,copyDatabase已弃用。从现在开始,我们应该使用:mongump和mongorestore。

假设我们有一个名为: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

现在我们将db转储为一个名为: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


mongoshdeprecederror: [COMMON-10003] copyDatabase()已被移除,因为它在MongoDB 4.0中已弃用


是的,这一切看起来都很混乱,其他答案似乎不适合我——大概是因为对工具进行了更多的更改——或者因为我使用的是旧版本。我点击上面的https://stackoverflow.com/a/63372970/1892584,直到它为我工作

我把我的答案包括在内,这样我下次就可以参考了。

我用它来转储一个存档:

mongodb——archive——db=mongodb+srv://$HOST/$OLD_DB > backup . zip

这将恢复到一个新的db:

mongorestore——nsInclude = " OLD_DB美元。*”——nsFrom = ' OLD_DB美元。*’——nsTo = ' NEW_DB美元。*' mongodb+srv://$HOST/$NEW_DB——archive=backup . //

注意nsInclude, nsFrom和nsTo参数。

这是我的mongorestore和mongodump版本

mongodump --version
mongodump version: 100.6.0
git version: 1d46e6e7021f2f5668763dba624e34bb39208cb0
Go version: go1.17.10
   os: darwin
   arch: amd64
   compiler: gc

mongorestore --version
mongorestore version: 100.6.0
git version: 1d46e6e7021f2f5668763dba624e34bb39208cb0
Go version: go1.17.10
   os: darwin
   arch: amd64
   compiler: gc

谁知道这是否适用于不同的版本。