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


483

내 MongoDB 데이터베이스 이름에 오타가 있으며 데이터베이스의 이름을 바꾸려고합니다.

이렇게 복사 하고 삭제할 수 있습니다 ...

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

데이터베이스 이름을 바꾸는 명령이 있습니까?


에서 몽고 4.2copyDatabase되지 않는
수밋 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

따라서 MongoDB에는 복사 및 삭제라는 두 가지 함수를 호출하는 하나의 명령이 있어야합니다. 이 단일 명령을 사용해야 할 큰 이유는 없습니다. 그러나 일부에게는 좋을 수 있습니다.
TamusJRoyce

시작할 데이터베이스의 이름을 지정할 때, 그 이름은 Mongo가 생성하는 내부 이름의 별칭 일뿐입니다 (전 세계적으로 고유 한 이름 지정 규칙을 사용). 이런 식으로 데이터베이스 이름을 변경하는 것은 별칭을 변경하고 클러스터의 모든 노드에 전파하는 것만 큼 간단합니다. 나는 말해야한다. 그렇지 않다.
Lonnie Best

396

당신은 이것을 할 수 있습니다 :

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

편집자 주 : 이것은 질문 자체에서 사용 된 것과 동일한 접근 방법이지만 다른 사람들에게 유용하다는 것이 입증되었습니다.


38
세 번째 인수는 실제로 생략 할 수 있으며 기본값은 동일한 서버입니다.
Haakon

15
db_to_rename과 db_renamed가 서로 다른 경우에만 작동하지 않습니다. 해당 상황에서 임시 데이터베이스를 사용해야합니다. (방금 이것에 부딪쳤다)
Sebastiaan M

71
이것이 OP에서 제공하는 솔루션과 어떻게 다릅니 까?
살바도르 달리

5
이것은 유일한 차이는 세 번째 인자 인와 실제 질문과 동일 copyDatabase방법
Gurbakhshish 싱

2
이것은 유일한 차이는 세 번째 인자 인와 실제 질의와 동일 copyDatabase불필요 방법 * 및 OP 이미 알고라고 한 것, 따라서 더 용액 * 공통 @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

대단해! 나는 이미 mongodump창조했다. 다른 이름으로 복원 할 수 있다는 것을 몰랐습니다. 감사!
Dushyant Bangal

5
참고 : --gzip아카이브 를 사용 하고 만들면 작동하지 않습니다
Dushyant Bangal

9
db.copyDatabase()더 이상 사용되지 않으므로 권장되는 방법입니다.
osolmaz

아니요, --db( -d) 인수 자체는 더 이상 사용되지 않습니다. 약간의 지원 중단 파티가 진행 중이며 주어진 copyDatabase것도 사라진 것 같습니다 . 내 노트로 SERVER-701을 찔렀습니다 .
amcgregor

28

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

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

따라서이 맥락에서 테스트의 모든 컬렉션 (테이블)은 영화 데이터베이스에 복사 됩니다.



@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

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

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

훌륭한 제안 IMHO. 그러나 이것이 원본 DB에서 공간을 확보하지는 않지만 데이터를 복사하는 것보다 이름이 훨씬 빠릅니다.
sirfz

1
스크래치, 어쨌든 복사를 수행합니다 (공백을 제거하지 않기 때문에 실제로는 단순한 이름 바꾸기가 아니기 때문에) 복사 및 삭제 보다이 방법의 실질적 이점이 없습니다.
sirfz

5

데이터베이스 이름을 바꾸는 메커니즘은 없습니다. 글을 쓰는 시점에서 현재 허용 대답은 사실에 입각하여 정확하지 않으며 변명 상류에 같은 이벤트 몇 가지 흥미로운 배경 세부하지만 동작을 복제하기위한 이벤트에는 제안. 기능이 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옵션 을 사용하는 것과 동일하며 복원중인 항목을 필터링하지 않기 때문에 사용할 올바른 네임 스페이스 조작 설정입니다.


1
--nsFrom그리고 --nsTo나를 위해 일했습니다. 감사합니다!
Bhargav Shah

nsFrom / To가있는
mongodump

4

나는 노력했다.

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

백업 또는 DB 이름을 변경했지만 몽고 커뮤니티에서 더 이상 사용되지 않는다는 것을 알게되었습니다.

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.