私のMongoDBデータベース名にタイプミスがあり、私はデータベースの名前を変更しようとしています。
コピー して削除できます...
db.copyDatabase('old_name', 'new_name');
use old_name
db.dropDatabase();
データベースの名前を変更するコマンドはありますか?
いいえ、ありません。 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();
編集者注記:これは質問自体で使用されているのと同じアプローチですが、関係なく他のユーザーにとって有用であることが証明されています。
別の解決策:データベースをダンプして別の名前で復元することができます。私が経験したように、それは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/
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');
したがって、このコンテキストでは、テストのすべてのコレクション(テーブル)が映画データベースにコピーされます。
上記のプロセスは遅いです、あなたは以下の方法を使用することができますが、あなたはコレクションごとに別のデータベースにコレクションを移動する必要があります。
use admin
db.runCommand({renameCollection: "[db_old_name].[collection_name]", to: "[db_new_name].[collection_name]"})
すべてのデータを管理データベースに入れた場合(そうすべきではありません)、db.copyDatabase()
は機能しないことに気付くでしょう。なぜならあなたのユーザはあなたがおそらくそれを与えたくない多くの特権を必要とするからです。これはデータベースを手動でコピーするスクリプトです。
use old_db
db.getCollectionNames().forEach(function(collName) {
db[collName].find().forEach(function(d){
db.getSiblingDB('new_db')[collName].insert(d);
})
});
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});
}