답변:
없습니다. 참조 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
방법
copyDatabase
불필요 방법 * 및 OP 이미 알고라고 한 것, 따라서 더 용액 * 공통 @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()
더 이상 사용되지 않으므로 권장되는 방법입니다.
--db
( -d
) 인수 자체는 더 이상 사용되지 않습니다. 약간의 지원 중단 파티가 진행 중이며 주어진 copyDatabase
것도 사라진 것 같습니다 . 내 노트로 SERVER-701을 찔렀습니다 .
참고 :이 최신 버전에서 변경 되었기를 바랍니다.
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');
따라서이 맥락에서 테스트의 모든 컬렉션 (테이블)은 영화 데이터베이스에 복사 됩니다.
copyDatabase
사라. 내 노트로 SERVER-701을 찔렀습니다 .
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
과 비슷하게 대체 해야 합니다.
위의 프로세스는 느리므로 아래 방법을 사용할 수 있지만 컬렉션별로 컬렉션을 다른 db로 이동해야합니다.
use admin
db.runCommand({renameCollection: "[db_old_name].[collection_name]", to: "[db_new_name].[collection_name]"})
데이터베이스 이름을 바꾸는 메커니즘은 없습니다. 글을 쓰는 시점에서 현재 허용 대답은 사실에 입각하여 정확하지 않으며 변명 상류에 같은 이벤트 몇 가지 흥미로운 배경 세부하지만 동작을 복제하기위한 이벤트에는 제안. 기능이 4.0에서 제거되었으므로 다른 답변 copyDatabase
은 더 이상 옵션이 아닙니다 . 노트 와 창의력으로 SERVER-701을 업데이트했습니다 . 🙃
상응하는 동작은 포함 mongodump
와 mongorestore
댄스의 비트에서 :
사용중인 "네임 스페이스"를 기록하여 데이터를 내 보냅니다. 예를 들어, 내 데이터 세트 중 하나에 네임 스페이스가있는 컬렉션 이 있습니다. 다음 단계에서 byzmcbehoomrfjcs9vlj.Analytics
접두사 ( 실제로 데이터베이스 이름 )가 필요합니다.
데이터, 공급 --nsFrom
및 --nsTo
인수를 가져옵니다 . ( 문서. ) 좀 더 감각적 인 이름으로 복원하기 위해 위의 가상의 (그리고 읽을 수없는) 예제를 계속해서 호출합니다.
mongorestore --archive=backup.agz --gzip --drop \
--nsFrom 'byzmcbehoomrfjcs9vlj.*' --nsTo 'rita.*'
일부는 --db
mongorestore 에 대한 논쟁을 지적 할 수도 있지만, 이는 더 이상 사용되지 않으며 " use --nsInclude instead
"에 대한 잘못된 제안으로 BSON 이외의 폴더 백업에 대한 경고를 트리거합니다 . 위의 네임 스페이스 변환은 --db
옵션 을 사용하는 것과 동일하며 복원중인 항목을 필터링하지 않기 때문에 사용할 올바른 네임 스페이스 조작 설정입니다.
--nsFrom
그리고 --nsTo
나를 위해 일했습니다. 감사합니다!
나는 노력했다.
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/
관리자 데이터베이스에 모든 데이터를 넣은 경우 (그렇지 않아야 함), db.copyDatabase()
사용자에게는 원하지 않는 많은 권한이 필요하기 때문에 작동하지 않을 것입니다. 데이터베이스를 수동으로 복사하는 스크립트는 다음과 같습니다.
use old_db
db.getCollectionNames().forEach(function(collName) {
db[collName].find().forEach(function(d){
db.getSiblingDB('new_db')[collName].insert(d);
})
});
copyDatabase
도 되지 않는