我的 MongoDB 数据库名称中有错字,我正在寻找重命名数据库。
我可以复制并像这样删除…
db.copyDatabase('old_name', 'new_name');
use old_name
db.dropDatabase();
是否有重命名数据库的命令?
如果您使用的是 MongoDB < 4.2 (参考):
db.copyDatabase("db_to_rename","db_renamed","localhost")
use db_to_rename
db.dropDatabase();
编者注:这与问题本身使用的方法相同,但无论如何都证明对其他人有用。
关于第三个论点的答案令人困惑copyDatabase
.见MongoDB 复制数据库命令弄清楚。
对于第三个参数,我建议放置“localhost”。为清晰起见进行了编辑
第三个参数实际上可以省略,它将默认为同一服务器。
请注意,当 db_to_rename 和 db_renamed 只是大小写不同时,这不起作用。在这种情况下,您必须使用临时数据库。 (我刚遇到这个:)
这与 OP 提供的解决方案有何不同?
根据stackoverflow.com/questions/12286873/…db.copyDatabase() 进行内存复制。真的吗?
请注意,第三个参数“localhost”是可选的。
这与实际问题相同,唯一的区别是第三个参数copyDatabase
方法
这与实际问题相同,唯一的区别是第三个参数copyDatabase
方法*,这是不必要的,因此是 OP 已经知道的更糟糕的解决方案。* cc @GurbakhshishSingh
警告:它绝对慢,包括完整的数据库扫描和索引重建。当您启动它时,您不能终止该操作。因此,您的磁盘空间可能会被杀死、运行缓慢等。
我正在使用robomongo
客户和我做了一个use db
表演前db.dropDatabase()
并意外删除了不同的数据库。更新答案以添加更多步骤以验证您是否在正确的数据库上或至少添加删除的数据库不可逆的评论是有意义的。
除了几乎是原始问题示例的复制粘贴之外,它在 4.0 之后也是无效且无法使用的,因为它们已被删除copyDatabase
完全。参考。我的答案对于当前的现代方法。
警告:db.copyDatabase 仅适用于 MongoDB 4.0 及以下版本。看dochub.mongodb.org/core/4.2-copydb-clone
db.copyDatabase
不再在 mongodb 4.4 上
copyDatabase() 已被弃用,不再起作用。
替代解决方案:您可以转储您的数据库并以不同的名称恢复它。正如我所经历的那样,它比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”命令已弃用,请改用以下两个命令:
- mongodump(备份数据)
- mongorestore(将数据从 mongodump 恢复到新的命名空间)
这更快,并且作为“副作用”,您的数据库也被压缩了。
这很棒!我已经有一个mongodump
创建的。不知道你可以用不同的名字恢复它。谢谢!
注意:如果您使用,这将不起作用--gzip
并创建档案
这是现在推荐的方式,因为db.copyDatabase()
现在已弃用
注意到不,--db
(-d
) 参数本身也已弃用。考虑到,似乎有一些弃用派对正在进行copyDatabase
也不见了。我戳过SERVER-701 和我的笔记.
截至 2019 年 9 月 10 日,这是 Mongo 问题中的推荐方法[服务器-701]请求数据库重命名功能。
感谢@tomako 的回答。这是唯一对我有用的解决方案。官方解决方案mongodump
和mongorestore
如前所述这里从来没有在我的 Windows 10 PC 上工作过。虽然mongodump
成功了,mongorestore
每次投掷都失败duplicate key error
尽管试图恢复到一个新的数据库。我不知道为什么以及如何获得duplicate key error
.最后,这个解决方案挽救了我的一天。
注意:希望这在最新版本中有所改变。
您不能在 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');
所以在这种情况下,所有的集合(表)测试将被复制到电影数据库。
@amcgregor 感谢您的通知。我已经添加了相同的评论。希望它对某人有所帮助。
db.copyDatabase
不再在 mongodb 4.4 上
@datinhquoc 是的,将其添加为评论
从 4.2 版开始,copyDatabase
已弃用。从现在开始,我们应该使用:mongodump
和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
现在我们将数据库转储为一个名为:old_name_dump.db
.
要使用新名称恢复:
mongorestore --archive="old_name_dump.db" --nsFrom="old_name.*" --nsTo="new_name.*"
同样,如果您需要进行身份验证,请将此参数添加到命令中:
-u username --authenticationDatabase admin
您可以使用标准输出作为管道进行重命名,而不是使用存档文件mongodump --archive --db=old_name | mongorestore --archive --nsFrom='old_name.*' --nsTo='new_name.*'
虽然 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 会将源集合中的所有文档复制到目标集合。根据集合的大小,这可能需要更长的时间才能完成。
索引和其他元数据是维护还是丢失?
@UDB 很可能保留。 “重命名集合”是一个命名空间转换, 基本上你的收藏名为foo
内bar
数据库的命名空间为bar.foo
.上的索引_id
因此有命名空间bar.foo._id_
.重命名集合(应该)在它知道的所有命名空间上执行前缀搜索和替换,类似于--nsFrom
和--nsTo
选项mongorestore
.
代价可能是巨大的!docs.mongodb.com/manual/reference/command/renameCollection/…如果目标数据库与源数据库相同,renameCollection 只是更改命名空间。这是一个快速操作。如果目标数据库与源数据库不同,renameCollection 会将源集合中的所有文档复制到目标集合。根据集合的大小,这可能需要更长的时间才能完成。
请改变你的答案。您的回答很有帮助,因为可以使用此命令将集合移动到另一个数据库。但这是不正确的,它可能会误导其他人。
从蒙戈 4.2甚至
copyDatabase
也是已弃用