回答:
いいえ、ありません。https://jira.mongodb.org/browse/SERVER-701を参照してください
残念ながら、これは、データベースメタデータが元の(デフォルトの)ストレージエンジンに格納される方法が原因で、実装が簡単な機能ではありません。MMAPv1ファイルでは、すべての単一のコレクションとインデックスを記述する名前空間(例:dbName.collection)にデータベース名が含まれているため、一連のデータベースファイルの名前を変更するには、すべての単一の名前空間文字列を書き換える必要があります。これは以下に影響します:
- .nsファイル
- コレクションのすべての番号付きファイル
- すべてのインデックスの名前空間
- 各コレクションとインデックスの内部で一意の名前
- system.namespacesとsystem.indexes(または将来的には同等のもの)の内容
- 私が行方不明かもしれない他の場所
これは、スタンドアロンの mongodインスタンスで単一のデータベースの名前を変更するためのものです。レプリカセットの場合、上記をすべてのレプリカノードで実行する必要があります。さらに、各データベースで、このデータベースを参照するすべてのoplogエントリを何らかの方法で無効化または書き換える必要があります。また、シャードクラスタの場合は、これらも追加する必要があります。 DBがシャード化されている場合はすべてのシャードに変更が加えられ、さらに構成サーバーには、フルネームのネームスペースに関してすべてのシャードメタデータがあります。
ライブシステムでこれを行う方法は絶対にありません。
オフラインで行うには、新しい名前に対応するためにすべてのデータベースファイルを書き直す必要があり、その時点では現在の「copydb」コマンドと同じくらい遅くなります...
あなたはこれを行うことができます:
db.copyDatabase("db_to_rename","db_renamed","localhost")
use db_to_rename
db.dropDatabase();
編集者注記:これは質問自体で使用されるのと同じアプローチですが、関係なく他の人に役立つことが証明されています。
copyDatabase
メソッドの3番目の引数です
copyDatabase
method *の3番目の引数であり、これは不要であるため、OPがすでに認識しているものよりも悪い解決策です。* cc @GurbakhshishSingh
代替ソリューション: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/
mongodump
作成しました。別の名前で復元できることを知りませんでした。ありがとう!
--gzip
アーカイブを使用して作成した場合、これは機能しません
db.copyDatabase()
廃止される
注:うまくいけば、これは最新バージョンで変更されました。
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');
したがって、このコンテキストでは、テストのすべてのコレクション(テーブル)が映画データベースにコピーされます。
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});
}
foo
に、bar
データベース内で名前が付けられたコレクションの名前空間はbar.foo
です。_id
したがって、上のインデックスには名前空間がありますbar.foo._id_
。コレクションの名前を変更すると、プレフィックス検索を実行し、やのオプション--nsFrom
と同様に、認識しているすべてのネームスペースを置き換え--nsTo
ますmongorestore
。
上記のプロセスは遅く、以下の方法を使用できますが、コレクションごとに別のデータベースに移動する必要があります。
use admin
db.runCommand({renameCollection: "[db_old_name].[collection_name]", to: "[db_new_name].[collection_name]"})
データベースの名前を変更するメカニズムはありません。執筆時点では、現在受け入れ答えは、事実上、正しいと言い訳の上流によう申し出いくつかの興味深い背景の詳細をですが、動作を複製するために何の示唆を提供しています。他の回答はを指していますが、4.0で機能が削除さcopyDatabase
れたため、これはオプションではなくなりました。SERVER-701をメモと信じられないほど更新しました。🙃
同等の動作が必要mongodump
とmongorestore
ダンスのビットで:
使用中の「名前空間」を書き留めて、データをエクスポートします。たとえば、私のデータセットの1つに、名前空間を持つコレクションがあります。byzmcbehoomrfjcs9vlj.Analytics
その接頭辞(実際にはデータベース名)が次の手順で必要になります。
データを提供し--nsFrom
、--nsTo
引数をインポートします。(ドキュメンテーション。)上記の架空の(そして非常に読みにくい)例を続けて、より意味のある名前に復元するには、次のように呼び出します。
mongorestore --archive=backup.agz --gzip --drop \
--nsFrom 'byzmcbehoomrfjcs9vlj.*' --nsTo 'rita.*'
--db
mongorestoreへの引数を指摘する人もいますが、これも非推奨であり、BSON以外のフォルダーバックアップでの使用に対して警告をトリガーし、「use --nsInclude instead
」に対して完全に誤った提案をします。上記の名前空間の変換は、--db
オプションの使用と同等であり、復元されているものをフィルタリングすることを試みていないため、使用する正しい名前空間操作設定です。
--nsFrom
そして--nsTo
私のために働いた。ありがとうございました!
やってみました。
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/
すべてのデータを管理データベースに入れた場合(すべきではありません)、db.copyDatabase()
ユーザーが必要としない多くの特権をユーザーが必要とするため、機能しないことに気付くでしょう。次に、データベースを手動でコピーするスクリプトを示します。
use old_db
db.getCollectionNames().forEach(function(collName) {
db[collName].find().forEach(function(d){
db.getSiblingDB('new_db')[collName].insert(d);
})
});
copyDatabase
もされた非推奨