2014-07-16 4 views
2

큰 몽고 데이터베이스 (90GB)를 복원 중입니다. mongorestore를 사용하고 있으며 복원 프로세스의 70 ~ 90 %가 자동으로 실패합니다. mongorestore를 시작할 때 덤프의 첫 번째 문서를 건너 뛸 수있는 방법이 있습니까? 필터 쿼리를 제공 할 수있는 필터 옵션이 있지만 도움이되지 않습니다.MongoRestore, 첫 번째 문서 건너 뛰기

전체 백업을 다시 복원하려고하면 중복 인덱스 오류로 인해 많은 시간이 걸립니다. 다시 한 번 데이터베이스를 복원하려고했지만 소켓 예외로 인해 다시 한 번 실패합니다.

mongorestore가 bson 덤프를 순차적으로 처리하는 것으로 보이므로 다음과 같은 방법이 있는지 궁금합니다. "그냥 건너 뜁니다. 1'234'567 덤프의 첫 번째 문서 및 나머지 복원 "

큰 컬렉션이 하나뿐입니다. 나는 이미 다른 부분에서 덤프를 깨뜨 렸지만 충분하지는 않습니다. mongorestore에게 복원 된 문서를 건너 뛰고 계속 진행하는 것이 더 쉬울 것입니다.

감사

+1

첫 번째 n 개의 문서를 건너 뛰거나 전체 백업을 복원하는 것이 좋습니까? 또한 데이터베이스에 몇 개의 콜렉션이 있습니까? 각 컬렉션의 백업을 수행 한 다음 하나씩 복원하는 스크립트를 작성할 수 있다고 생각합니다. –

+0

이미 덤프를 분할했습니다. 위의 편집을 참조하십시오. mongorestore에게 문서를 건너 뛰라고 말할 방법이 없다면이 방법을 계속 사용 하시겠습니까? –

답변

2

은 내가 아는 같은 mongorestore을 수행 할 때 해당 문서를 건너 MongoDB를 말할 수있는 방법은 없습니다,하지만 당신은이를 에뮬레이트 무언가를하기 위해 --filter 옵션을 이용할 수 있습니다. ObjectIds 또는 어떤 종류의 시퀀스가있는 _id을 사용한다고 가정하면 컬렉션에서 쿼리를 수행하여 n 번째 문서의 _id을 찾을 수 있습니다. 이런 식으로 뭔가가 :

db.collection.find({}, { "_id" : 1 }).skip(n-1).limit(1); 

당신 만이 _id보다 큰 모든 문서를 복원 할 이야기는 --filter 옵션에 매개 변수로이 _id을 전달할 수 있습니다. 이런 일이 : 복원하기 전에 데이터베이스를 삭제하려면

mongorestore --filter '{"_id": { $gt : "<ID>" }}' 

, 당신은 위의 명령에 --drop 옵션을 추가 할 수 있습니다.

이렇게하면 n 번째 문서보다 큰 _id 인 문서 만 복원되어 컬렉션의 처음 n 개 문서를 효과적으로 건너 뜁니다.

+0

감사합니다. 나는 그것을 시도 할 것입니다. AFAK _id는 타임 스탬프와 다른 것으로 생성되므로 제대로 작동해야합니다. –

+0

예. 그럼 그럴거야. 알려줘. –

관련 문제