问答中心分类: MONGODB如何重命名 MongoDB 数据库?
0
匿名用户 提问 3周 前

我的 MongoDB 数据库名称中有错字,我正在寻找重命名数据库。
我可以复制并像这样删除…

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

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

Sumit Ramteke 回复 3周 前

蒙戈 4.2甚至copyDatabase也是已弃用

9 Answers
0
bzmw 回答 3周 前

如果您使用的是 MongoDB < 4.2 (参考):

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

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

David J. 回复 3周 前

关于第三个论点的答案令人困惑copyDatabase.见MongoDB 复制数据库命令弄清楚。

bzmw 回复 3周 前

对于第三个参数,我建议放置“localhost”。为清晰起见进行了编辑

Haakon 回复 3周 前

第三个参数实际上可以省略,它将默认为同一服务器。

Sebastiaan M 回复 3周 前

请注意,当 db_to_rename 和 db_renamed 只是大小写不同时,这不起作用。在这种情况下,您必须使用临时数据库。 (我刚遇到这个:)

Salvador Dali 回复 3周 前

这与 OP 提供的解决方案有何不同?

rakslice 回复 3周 前

根据stackoverflow.com/questions/12286873/…db.copyDatabase() 进行内存复制。真的吗?

BraveNewMath 回复 3周 前

请注意,第三个参数“localhost”是可选的。

Gurbakhshish Singh 回复 3周 前

这与实际问题相同,唯一的区别是第三个参数copyDatabase方法

Trindaz 回复 3周 前

这与实际问题相同,唯一的区别是第三个参数copyDatabase方法*,这是不必要的,因此是 OP 已经知道的更糟糕的解决方案。* cc @GurbakhshishSingh

user172163 回复 3周 前

警告:它绝对慢,包括完整的数据库扫描和索引重建。当您启动它时,您不能终止该操作。因此,您的磁盘空间可能会被杀死、运行缓慢等。

Raf 回复 3周 前

我正在使用robomongo客户和我做了一个use db表演前db.dropDatabase()并意外删除了不同的数据库。更新答案以添加更多步骤以验证您是否在正确的数据库上或至少添加删除的数据库不可逆的评论是有意义的。

amcgregor 回复 3周 前

除了几乎是原始问题示例的复制粘贴之外,它在 4.0 之后也是无效且无法使用的,因为它们已被删除copyDatabase完全。参考。我的答案对于当前的现代方法。

kris 回复 3周 前

警告:db.copyDatabase 仅适用于 MongoDB 4.0 及以下版本。看dochub.mongodb.org/core/4.2-copydb-clone

Dee 回复 3周 前

db.copyDatabase不再在 mongodb 4.4 上

N. Raj 回复 3周 前

copyDatabase() 已被弃用,不再起作用。

0
tomako 回答 3周 前

替代解决方案:您可以转储您的数据库并以不同的名称恢复它。正如我所经历的那样,它比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”命令已弃用,请改用以下两个命令:

  1. mongodump(备份数据)
  2. mongorestore(将数据从 mongodump 恢复到新的命名空间)
Comtaler 回复 3周 前

这更快,并且作为“副作用”,您的数据库也被压缩了。

Dushyant Bangal 回复 3周 前

这很棒!我已经有一个mongodump创建的。不知道你可以用不同的名字恢复它。谢谢!

Dushyant Bangal 回复 3周 前

注意:如果您使用,这将不起作用--gzip并创建档案

osolmaz 回复 3周 前

这是现在推荐的方式,因为db.copyDatabase()现在已弃用

amcgregor 回复 3周 前

注意到不,--db(-d) 参数本身也已弃用。考虑到,似乎有一些弃用派对正在进行copyDatabase也不见了。我戳过SERVER-701 和我的笔记.

M. Justin 回复 3周 前

截至 2019 年 9 月 10 日,这是 Mongo 问题中的推荐方法[服务器-701]请求数据库重命名功能。

priyamtheone 回复 3周 前

感谢@tomako 的回答。这是唯一对我有用的解决方案。官方解决方案mongodumpmongorestore如前所述这里从来没有在我的 Windows 10 PC 上工作过。虽然mongodump成功了,mongorestore每次投掷都失败duplicate key error尽管试图恢复到一个新的数据库。我不知道为什么以及如何获得duplicate key error.最后,这个解决方案挽救了我的一天。

0
Channaveer Hakari 回答 3周 前

注意:希望这在最新版本中有所改变。
您不能在 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')

现在您可以通过以下方式安全地删除旧数据库

use testing;

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

现在想想如果您尝试用现有数据库名称重命名新数据库名称会发生​​什么
例子:

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

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

Channaveer Hakari 回复 3周 前

@amcgregor 感谢您的通知。我已经添加了相同的评论。希望它对某人有所帮助。

Dee 回复 3周 前

db.copyDatabase不再在 mongodb 4.4 上

Channaveer Hakari 回复 3周 前

@datinhquoc 是的,将其添加为评论

0
Ravexina 回答 3周 前

从 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

a_manfrinati 回复 3周 前

您可以使用标准输出作为管道进行重命名,而不是使用存档文件mongodump --archive --db=old_name | mongorestore --archive --nsFrom='old_name.*' --nsTo='new_name.*'

0
HbnKing 回答 3周 前

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

{ 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 会将源集合中的所有文档复制到目标集合。根据集合的大小,这可能需要更长的时间才能完成。

Udit Bhardwaj 回复 3周 前

索引和其他元数据是维护还是丢失?

amcgregor 回复 3周 前

@UDB 很可能保留。 “重命名集合”是一个命名空间转换, 基本上你的收藏名为foobar数据库的命名空间为bar.foo.上的索引_id因此有命名空间bar.foo._id_.重命名集合(应该)在它知道的所有命名空间上执行前缀搜索和替换,类似于--nsFrom--nsTo 选项mongorestore.

nagylzs 回复 3周 前

代价可能是巨大的!docs.mongodb.com/manual/reference/command/renameCollection/…如果目标数据库与源数据库相同,renameCollection 只是更改命名空间。这是一个快速操作。如果目标数据库与源数据库不同,renameCollection 会将源集合中的所有文档复制到目标集合。根据集合的大小,这可能需要更长的时间才能完成。

nagylzs 回复 3周 前

请改变你的答案。您的回答很有帮助,因为可以使用此命令将集合移动到另一个数据库。但这是不正确的,它可能会误导其他人。