[mongodb] MongoDB 데이터베이스의 이름을 어떻게 바꾸나요?

내 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를 덤프하고 다른 이름으로 복원 할 수 있습니다. 내가 경험 한 것보다 훨씬 빠릅니다 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/


답변

참고 :이 최신 버전에서 변경 되었기를 바랍니다.

FCV 값에 관계없이 MongoDB 4.0 mongod 인스턴스와 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')

이제 다음 방법으로 이전 DB를 안전하게 삭제할 수 있습니다

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


답변

위의 프로세스는 느리므로 아래 방법을 사용할 수 있지만 컬렉션별로 컬렉션을 다른 db로 이동해야합니다.

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


답변

데이터베이스 이름을 바꾸는 메커니즘은 없습니다. 글을 쓰는 시점에서 현재 허용 대답은 사실에 입각하여 정확하지 않으며 변명 상류에 같은 이벤트 몇 가지 흥미로운 배경 세부하지만 동작을 복제하기위한 이벤트에는 제안. 기능이 4.0에서 제거되었으므로 다른 답변 copyDatabase은 더 이상 옵션이 아닙니다 . 노트 와 창의력으로 SERVER-701을 업데이트했습니다 . ?

상응하는 동작은 포함 mongodumpmongorestore댄스의 비트에서 :

  1. 사용중인 “네임 스페이스”를 기록하여 데이터를 내 보냅니다. 예를 들어, 내 데이터 세트 중 하나에 네임 스페이스가있는 컬렉션 이 있습니다. 다음 단계에서 byzmcbehoomrfjcs9vlj.Analytics접두사 ( 실제로 데이터베이스 이름 )가 필요합니다.

  2. 데이터, 공급 --nsFrom--nsTo인수를 가져옵니다 . ( 문서. ) 좀 더 감각적 인 이름으로 복원하기 위해 위의 가상의 (그리고 읽을 수없는) 예제를 계속해서 호출합니다.

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

일부는 --dbmongorestore 에 대한 논쟁을 지적 할 수도 있지만, 이는 더 이상 사용되지 않으며 ” use --nsInclude instead“에 대한 잘못된 제안으로 BSON 이외의 폴더 백업에 대한 경고를 트리거합니다 . 위의 네임 스페이스 변환은 --db옵션 을 사용하는 것과 동일하며 복원중인 항목을 필터링하지 않기 때문에 사용할 올바른 네임 스페이스 조작 설정입니다.