web-dev-qa-db-ja.com

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

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

コピー して削除できます...

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

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

438
Brian Hempel

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

残念ながら、これはデータベースメタデータがオリジナルの(デフォルトの)ストレージエンジンに保存される方法のために実装するのが簡単な機能ではありません。 MMAPv1ファイルでは、すべての単一のコレクションおよびインデックスを記述する名前空間(例えば、dbName.collection)はデータベース名を含むので、データベースファイルのセットの名前を変更するためには、すべての単一の名前空間文字列を書き換える必要がある。これによる影響:

  • .nsファイル
  • コレクションのすべての番号付きファイル
  • すべてのインデックスの名前空間
  • 各コレクションおよび索引の内部固有の名前
  • system.namespacesおよびsystem.indexesの内容(または将来それらに相当するもの)
  • 私が行方不明になっているかもしれない他の場所

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

実際のシステムでこれを行う方法は絶対にありません。

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

182
pingw33n

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

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

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

374
bzmw

別の解決策:データベースをダンプして別の名前で復元することができます。私が経験したように、それは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/

138
tomako

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

したがって、このコンテキストでは、テストのすべてのコレクション(テーブル)が映画データベースにコピーされます。

23

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

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

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

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

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