你如何重命名MongoDB数据库?

Bri*_*pel 456 database mongodb

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

我可以这样复制和删除......

db.copyDatabase('old_name', 'new_name');
use old_name
db.dropDatabase();
Run Code Online (Sandbox Code Playgroud)

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

bzm*_*zmw 385

你可以这样做:

db.copyDatabase("db_to_rename","db_renamed","localhost")
use db_to_rename
db.dropDatabase();
Run Code Online (Sandbox Code Playgroud)

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

  • 这与OP提供的解决方案有何不同? (70认同)
  • 第三个参数实际上可以省略,它将默认为同一个服务器. (37认同)
  • 请注意,当db_to_rename和db_renamed仅在大小写不同时,这不起作用.在这种情况下,您必须使用临时数据库.(我刚碰到这个:) (15认同)
  • 除了它几乎是原始问题示例的复制粘贴之外,它在 4.0 之后也是无效且不起作用的,因为他们已经完全删除了“copyDatabase”。参考号 [我的答案](/sf/answers/4046819101/)适用于当前的现代方法。 (9认同)
  • 这与实际问题相同,唯一的区别是`copyDatabase`方法中的第三个参数 (5认同)
  • 警告:db.copyDatabase 仅适用于 MongoDB 4.0 及更低版本。请参阅http://dochub.mongodb.org/core/4.2-copydb-clone (3认同)
  • 这与实际问题相同,唯一的区别是“ copyDatabase”方法*中的第三个参数,这是不必要的,因此是OP已经意识到的更差的解决方案。* cc @GurbakhshishSingh (2认同)
  • mongodb 4.4 上不再有“db.copyDatabase” (2认同)

pin*_*33n 191

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

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

  • .ns文件
  • 集合的每个编号文件
  • 每个索引的命名空间
  • 每个集合和索引的内部唯一名称
  • system.namespaces和system.indexes的内容(或将来的等价物)
  • 我可能遗失的其他地方

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

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

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

  • 当您开始命名数据库时,它应该只是 Mongo 生成的内部名称的别名(使用全局唯一命名约定)。这样,更改数据库的名称就像更改该别名并将其传播到集群中的所有节点一样简单。我说应该。不是这种情况。 (5认同)
  • 他们构建数据库并解释它的方式,重命名似乎是不可能的 - 可能需要一个全新的架构.似乎是一个很大的疏忽,但在爱情,战争和软件开发方面都是公平的. (4认同)
  • 那张票已经开了很长时间了.我已将我不太重要的投票添加到已经很长的名单中. (3认同)

tom*_*ako 150

替代解决方案:您可以转储数据库并以不同的名称还原它.正如我所经历的那样,它比它快得多db.copyDatabase().

$ mongodump -d old_db_name -o mongodump/
$ mongorestore -d new_db_name mongodump/old_db_name
Run Code Online (Sandbox Code Playgroud)

http://docs.mongodb.org/manual/tutorial/backup-with-mongodump/

  • 这是现在推荐的方法,因为现在不推荐使用`db.copyDatabase()` (9认同)
  • 这更快,作为"副作用",您的数据库也会被压缩. (6认同)
  • 注意:如果您使用`--gzip`并创建存档,则不起作用 (5认同)
  • 请注意,不,“--db”(“-d”)参数本身也已被弃用。鉴于 [`copyDatabase` 也消失了,似乎正在进行一些弃用派对。](https://docs.mongodb.com/manual/release-notes/4.0-compatibility/#copydb-and-克隆命令)我用我的笔记戳了[SERVER-701](https://jira.mongodb.org/browse/SERVER-701?focusedCommentId=2409300&page=com.atlassian.jira.plugin.system.issuetabpanels:comment -tabpanel#comment-2409300)。 (2认同)

Cha*_*ari 24

警告:如果您不想在单个数据库下搞乱不同的集合,请在复制数据库时小心.

以下显示如何重命名

> show dbs;
testing
games
movies
Run Code Online (Sandbox Code Playgroud)

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

db.copyDatabase("old db name","new db name")
Run Code Online (Sandbox Code Playgroud)

例:

db.copyDatabase('testing','newTesting')
Run Code Online (Sandbox Code Playgroud)

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

use testing;

db.dropDatabase(); //Here the db **testing** is deleted successfully
Run Code Online (Sandbox Code Playgroud)

现在只考虑如果尝试使用现有数据库名称重命名新数据库名称会发生​​什么

例:

db.copyDatabase('testing','movies'); 
Run Code Online (Sandbox Code Playgroud)

因此,在此上下文中,所有测试集合(表格)都将复制到电影数据库中.

  • [`copyDatabase` 消失了。](https://docs.mongodb.com/manual/release-notes/4.0-compatibility/#copydb-and-clone-commands) 我用我的笔记戳了 [SERVER-701] (https://jira.mongodb.org/browse/SERVER-701?focusedCommentId=2409300&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-2409300)。 (2认同)

Rav*_*ina 15

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

假设我们有一个名为:的数据库old_name,我们想将其重命名为new_name.

首先,我们必须转储数据库:

mongodump --archive="old_name_dump.db" --db=old_name
Run Code Online (Sandbox Code Playgroud)

如果您必须以用户身份进行身份验证,请使用:

mongodump -u username --authenticationDatabase admin \
          --archive="old_name_dump.db" --db=old_name
Run Code Online (Sandbox Code Playgroud)

现在我们将数据库转储为一个名为:old_name_dump.db.

要使用新名称恢复:

mongorestore --archive="old_name_dump.db" --nsFrom="old_name.*" --nsTo="new_name.*"
Run Code Online (Sandbox Code Playgroud)

同样,如果您需要进行身份验证,请将此参数添加到命令中:

-u username --authenticationDatabase admin 
Run Code Online (Sandbox Code Playgroud)

参考:https : //docs.mongodb.com/manual/release-notes/4.2-compatibility/#remove-support-for-the-copydb-and-clone-commands

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

amc*_*gor 8

没有重命名数据库的机制。将在写作时目前公认的答案是正确的事实,并提供了一些有趣的背景细节为借口上游,但提供了复制的行为没有任何建议。其他答案指向copyDatabase,这不再是一个选项,因为该功能已在 4.0 中删除。我已经用我的笔记和怀疑更新了SERVER-701

等效的行为涉及mongodumpmongorestore有点像舞蹈:

  1. 导出您的数据,记下正在使用的“命名空间”。例如,在我的一个数据集上,我有一个带有命名空间的集合byzmcbehoomrfjcs9vlj.Analytics——下一步将需要该前缀(实际上是数据库名称)。

  2. 导入您的数据、供应--nsFrom--nsTo参数。(文档。)继续我上面假设的(并且非常不可读)的例子,为了恢复到一个更有意义的名字,我调用:

mongorestore --archive=backup.agz --gzip --drop \
    --nsFrom 'byzmcbehoomrfjcs9vlj.*' --nsTo 'rita.*'
Run Code Online (Sandbox Code Playgroud)

有些人可能还会指出--dbmongorestore的论点,但是,这也已被弃用,并会触发警告,禁止在非 BSON 文件夹备份上使用,对“ use --nsInclude instead”提出完全错误的建议。上面的命名空间转换等效于使用该--db选项,并且是要使用的正确命名空间操作设置,因为我们不会尝试过滤正在恢复的内容。

  • amcgregor 链接的文档部分还有一个使用管道 `mongodump --archive --db=test | 的单行示例。mongorestore --archive --nsFrom='test.*' --nsTo='examples.*'` (4认同)
  • mongodump 和 nsFrom/To 是截至 2020 年的官方答案 (2认同)

Hbn*_*ing 6

尽管Mongodb不提供重命名数据库命令,但它提供了r ename Collection命令,它不仅可以修改集合名称,还可以修改数据库名称。

db.adminCommand({renameCollection: "db1.test1", to: "db2.test2"})
Run Code Online (Sandbox Code Playgroud)

该命令仅修改元数据,代价很小,我们只需要遍历下的所有集合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});
}
Run Code Online (Sandbox Code Playgroud)

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

mad*_*ram 5

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

use admin
db.runCommand({renameCollection: "[db_old_name].[collection_name]", to: "[db_new_name].[collection_name]"})
Run Code Online (Sandbox Code Playgroud)

  • 从头开始,无论如何它确实会进行复制(因为它不会删除空间,所以它不是一个简单的重命名),因此与复制和删除相比,此方法没有真正的优势。 (2认同)

小智 5

我试着做。

db.copyDatabase('DB_toBeRenamed','Db_newName','host') 
Run Code Online (Sandbox Code Playgroud)

并知道它已被 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
}
Run Code Online (Sandbox Code Playgroud)

所以不相信上述方法,我不得不使用以下命令转储本地

mongodump --host --db DB_TobeRenamed --out E://FileName/
Run Code Online (Sandbox Code Playgroud)

连接到 Db。

use DB_TobeRenamed
Run Code Online (Sandbox Code Playgroud)

然后

db.dropDatabase()
Run Code Online (Sandbox Code Playgroud)

然后用命令恢复数据库。

mongorestore -host hostName -d Db_NewName E://FileName/
Run Code Online (Sandbox Code Playgroud)