MongoDBデータベースの名前をどのように変更しますか?


484

MongoDBデータベース名にタイプミスがあり、データベースの名前を変更しようとしています。

私はそのようにコピーして削除できます ...

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

データベースの名前を変更するコマンドはありますか?


Mongoの4.2さえcopyDatabaseもされた非推奨
スミットRamteke

回答:


208

いいえ、ありません。https://jira.mongodb.org/browse/SERVER-701を参照してください

残念ながら、これは、データベースメタデータが元の(デフォルトの)ストレージエンジンに格納される方法が原因で、実装が簡単な機能ではありません。MMAPv1ファイルでは、すべての単一のコレクションとインデックスを記述する名前空間(例:dbName.collection)にデータベース名が含まれているため、一連のデータベースファイルの名前を変更するには、すべての単一の名前空間文字列を書き換える必要があります。これは以下に影響します:

  • .nsファイル
  • コレクションのすべての番号付きファイル
  • すべてのインデックスの名前空間
  • 各コレクションとインデックスの内部で一意の名前
  • system.namespacesとsystem.indexes(または将来的には同等のもの)の内容
  • 私が行方不明かもしれない他の場所

これは、スタンドアロンの mongodインスタンスで単一のデータベースの名前を変更するためのものです。レプリカセットの場合、上記をすべてのレプリカノードで実行する必要があります。さらに、各データベースで、このデータベースを参照するすべてのoplogエントリを何らかの方法で無効化または書き換える必要があります。また、シャードクラスタの場合は、これらも追加する必要があります。 DBがシャード化されている場合はすべてのシャードに変更が加えられ、さらに構成サーバーには、フルネームのネームスペースに関してすべてのシャードメタデータがあります。

ライブシステムでこれを行う方法は絶対にありません。

オフラインで行うには、新しい名前に対応するためにすべてのデータベースファイルを書き直す必要があり、その時点では現在の「copydb」コマンドと同じくらい遅くなります...


4
そのチケットは非常に長い間開かれています。重要度の低い投票をすでに長いリストに追加しました。
DJ van Wyk

4
彼らがDBを構築して説明した方法では、名前を変更することは不可能に思われます-まったく新しいアーキテクチャが必要になる場合があります。大きな見落としのように見えますが、愛、戦争、ソフトウェア開発はすべて公平です。
serraosays 2015年

MongoDBには、コピーとドロップという2つの関数を呼び出すコマンドが1つ必要ですか?この単一のコマンドを使用する大きな理由はないと思います。しかし、それは一部にとっては良いことかもしれません。
TamusJRoyce

最初にデータベースに名前を付ける場合、それは、Mongoが(グローバルに一意の命名規則を使用して)生成する内部名のエイリアスにする必要があります(SHOULD)。このように、データベースの名前を変更することは、そのエイリアスを変更し、それをクラスター内のすべてのノードに伝播するのと同じくらい簡単です。私は言うべきです。これはそうではありません。
Lonnie Best

396

あなたはこれを行うことができます:

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

編集者注記:これは質問自体で使用されるのと同じアプローチですが、関係なく他の人に役立つことが証明されています。


38
3番目の引数は実際には省略でき、デフォルトでは同じサーバーになります。
Haakon

15
db_to_renameとdb_renamedが大文字と小文字のみが異なる場合、これは機能しないことに注意してください。その場合は、一時データベースを使用する必要があります。(私はこれに遭遇しました:)
Sebastiaan M

71
これはOPによって提供されるソリューションとどのように異なりますか?
サルバドールダリ

5
これは実際の質問と同じですが、唯一の違いはcopyDatabaseメソッドの3番目の引数です
Gurbakhshish Singh

2
これは実際の質問と同じですが、唯一の違いはcopyDatabasemethod *の3番目の引数であり、これは不要であるため、OPがすでに認識しているものよりも悪い解決策です。* cc @GurbakhshishSingh
Trindaz

164

代替ソリューション:dbをダンプして、別の名前で復元できます。私が経験したように、それはよりもはるかに速いです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/


6
これはより高速で、「副作用」としてデータベースも圧縮されます。
Comtaler 2016

これは素晴らしい!私はすでにmongodump作成しました。別の名前で復元できることを知りませんでした。ありがとう!
Dushyant Bangal 2017年

5
注:--gzipアーカイブを使用して作成した場合、これは機能しません
Dushyant Bangal 2017年

9
ので、これは、今お勧めの方法でdb.copyDatabase()廃止される
osolmaz

いいえ、--db-d)引数自体も非推奨です。少し非難パーティーが続いているようですが、与えられたcopyDatabaseものもなくなったようです。 私は私のノートでSERVER-701を突いた。
amcgregor

28

注:うまくいけば、これは最新バージョンで変更されました。

MongoDB 4.0 mongodインスタンス(FCV値に関係なく)とMongoDB 3.4以前のmongodインスタンスの間でデータをコピーすることはできません。 https://docs.mongodb.com/v4.0/reference/method/db.copyDatabase/

ALERT:単一のデータベースで異なるコレクションをめちゃくちゃにしたくない場合は、データベースをコピーするときは注意してください。

以下は、名前を変更する方法を示しています

> 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通知ありがとうございます。同じことについてコメントを追加しました。それが誰かを助けることを願っています。
Channaveer Hakari

8

Mongodbは、データベースの名前変更コマンドを提供していませんが、コレクション名を変更するだけでなく、データベース名も変更するr ename Collectionコマンドを提供しています。

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

インデックスやその他のメタデータは維持または失われますか?
Udit Bhardwaj

@UDB保存される可能性が非常に高い。「コレクションの名前変更」は名前空間の変換であり、基本的fooに、barデータベース内で名前が付けられたコレクションの名前空間はbar.fooです。_idしたがって、上のインデックスには名前空間がありますbar.foo._id_。コレクションの名前を変更すると、プレフィックス検索を実行し、やのオプション--nsFromと同様に、認識しているすべてのネームスペースを置き換え--nsTo ますmongorestore
amcgregor

1
コストは非常に大きくなる可能性があります。docs.mongodb.com/manual/reference/command/renameCollection/…ターゲットデータベースがソースデータベースと同じ場合、renameCollectionは名前空間を変更するだけです。これは素早い操作です。ターゲットデータベースがソースデータベースと異なる場合、renameCollectionはすべてのドキュメントをソースコレクションからターゲットコレクションにコピーします。コレクションのサイズによっては、完了までにさらに時間がかかる場合があります。
nagylzs

回答を変更してください。このコマンドを使用すると、コレクションを別のデータベースに移動することができるので、答えは役に立ちます。しかし、それは正しくなく、他人を誤解させる可能性があります。
nagylzs

6

上記のプロセスは遅く、以下の方法を使用できますが、コレクションごとに別のデータベースに移動する必要があります。

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

優れた提案私見。ただし、これによって元のDBから領域が解放されるわけではありませんが、名前の変更はデータをコピーするよりもはるかに高速である必要があります。
sirfz 2015年

1
とにかく、コピーを実行します(スペースを削除しないため、実際には単純な名前変更ではありません)。このため、この方法にはコピーアンドドロップよりも利点はありません。
sirfz 2015年

5

データベースの名前を変更するメカニズムはありません。執筆時点では、現在受け入れ答えは、事実上、正しいと言い訳の上流によう申し出いくつかの興味深い背景の詳細をですが、動作を複製するために何の示唆を提供しています。他の回答はを指していますが、4.0で機能が削除さcopyDatabaseため、これはオプションではなくなりました。SERVER-701をメモと信じられないほど更新しました。🙃

同等の動作が必要mongodumpmongorestoreダンスのビットで:

  1. 使用中の「名前空間」を書き留めて、データをエクスポートします。たとえば、私のデータセットの1つに、名前空間を持つコレクションがあります。byzmcbehoomrfjcs9vlj.Analyticsその接頭辞(実際にはデータベース名)が次の手順で必要になります。

  2. データを提供し--nsFrom--nsTo引数をインポートします。(ドキュメンテーション。)上記の架空の(そして非常に読みにくい)例を続けて、より意味のある名前に復元するには、次のように呼び出します。

mongorestore --archive=backup.agz --gzip --drop \
    --nsFrom 'byzmcbehoomrfjcs9vlj.*' --nsTo 'rita.*'

--dbmongorestoreへの引数を指摘する人もいますが、これも非推奨であり、BSON以外のフォルダーバックアップでの使用に対して警告をトリガーし、「use --nsInclude instead」に対して完全に誤った提案をします。上記の名前空間の変換は、--dbオプションの使用と同等であり、復元されているものをフィルタリングすることを試みていないため、使用する正しい名前空間操作設定です。


1
--nsFromそして--nsTo私のために働いた。ありがとうございました!
Bhargav Shah

nsFrom / Toを含むmongodumpは、2020年時点での公式回答です
PaoloC

4

やってみました。

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

バックアップを作成したり、DBの名前を変更したにもかかわらず、mongoコミュニティによって非推奨になっていることを知りました。

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()

次に、コマンドでDBを復元しました。

mongorestore -host hostName -d Db_NewName E://FileName/

2

すべてのデータを管理データベースに入れた場合(すべきではありません)、db.copyDatabase()ユーザーが必要としない多くの特権をユーザーが必要とするため、機能しないことに気付くでしょう。次に、データベースを手動でコピーするスクリプトを示します。

use old_db
db.getCollectionNames().forEach(function(collName) {
    db[collName].find().forEach(function(d){
        db.getSiblingDB('new_db')[collName].insert(d); 
    }) 
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.