2012-02-08 66 views
361

我的MongoDB數據庫名稱中存在拼寫錯誤,我正在重新命名數據庫。你如何重命名一個MongoDB數據庫?

我可以copy和刪除這樣的...

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

是否有一個命令來重命名一個數據庫?

回答

152

不,沒有。見https://jira.mongodb.org/browse/SERVER-701

不幸的是,這不是一個簡單的功能爲我們實現由於該數據庫的元數據存儲在原始(默認)存儲引擎的方式。在MMAPv1文件中,描述每個集合和索引的命名空間(例如:dbName.collection)包含數據庫名稱,因此要重命名一組數據庫文件,每個命名空間字符串都必須重寫。這會影響:

  • 的.ns文件
  • 的收集
  • 命名空間爲每個索引的每一個編號的文件每個收集和索引system.namespaces的
  • 內容
  • 內唯一的名稱和系統索引(或其將來的等同物)
  • 其他位置我可能會丟失

這只是爲了完成一個獨立的 mongod實例中的單個數據庫的重命名。對於副本集,需要在每個副本節點上完成上述操作,而且在每個節點上,每個引用此數據庫的oplog條目必須以某種方式失效或重寫,然後如果它是分片集羣,則還需要添加這些如果數據庫已分片,則更改爲每個分片,並且配置服務器將使用名稱空間中的全名創建所有分片元數據。

在現場系統上絕對沒有辦法做到這一點。

要脫機做到這一點,它需要重新編寫每一個數據庫文件,以適應新的名稱,並在這一點上它會爲當前的「COPYDB」命令,慢...

+2

這票已經開了很長一段時間。我已經把我的不太重要的投票加入了已經很長的名單中。 – 2014-03-12 04:55:58

+2

他們建立數據庫並解釋它的方式,重命名似乎是不可能的 - 可能需要一個全新的架構。看起來像一個大的監督,但在愛情,戰爭和軟件開發方面都是公平的。 – staypuftman 2015-10-19 16:58:48

+1

從MongoDb到2017年4月30日,這仍然是真的。 – Daniel 2017-04-30 19:06:33

314

你可以這樣做:

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

編者按:這是問題本身所使用的相同的方法,但已被證明有用的人不管。

+0

答案是關於'copyDatabase'的第三個參數的混淆。查看[MongoDB複製數據庫命令](http://www.mongodb.org/display/DOCS/Copy+Database+Commands)以清除。 – 2012-08-04 20:19:27

+0

對於第三個參數,我建議把「本地主機」。爲清晰起見編輯 – bzmw 2012-08-10 14:54:36

+28

第三個參數實際上可以省略,它將默認爲同一個服務器。 – Haakon 2012-08-24 11:19:49

103

替代解決方案:您可以轉儲您的數據庫並以不同的名稱恢復它。正如我所經歷的,它比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/

+0

幫助我很多! – Cyborgz 2015-09-02 10:18:07

+4

這是更快,作爲「副作用」,您的數據庫也被壓縮。 – Comtaler 2016-02-01 19:42:54

+0

這太棒了!我已經創建了一個'mongodump'。不知道你可以用不同的名字恢復它。謝謝! – 2017-03-31 13:29:20

4

上述過程是緩慢的,你可以通過下面的方法,但你需要收集到移動收集到另一個數據庫。

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

極好的建議恕我直言。但值得注意的是,這不會釋放原始數據庫的空間,但重命名應該比複製數據快得多。 – sirfz 2015-11-20 13:10:38

+0

從頭開始,它確實做了一個副本(因爲它不會刪除空間,它不是簡單的重命名),所以這種方法在複製和放置方面沒有真正的優勢。 – sirfz 2015-11-20 13:30:22

6

ALERT:嘿人只是要小心,而複製數據庫,如果你不想弄糟下單個數據庫的不同集合。

下面顯示瞭如何重命名

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

所以在這個上下文所有集合(表) 測試將被複制到電影數據庫。

2

如果您將所有數據都放入管理數據庫(您不應該這樣做),您會注意到db.copyDatabase()不起作用,因爲您的用戶需要許多您可能不想提供的權限。下面是一個腳本來手動複製數據庫:

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