MongoDB에서 최근에 삭제된 문서를 복구할 수 있는 방법이 있습니까?
지난번 쿼리에서 실수로 일부 문서를 제거했습니다. 마지막 쿼리 mongo 컬렉션을 롤백할 수 있는 방법이 있습니까?
마지막 질문입니다.
db.foo.remove({ "name" : "some_x_name"})
롤백/실행 취소 옵션이 있습니까?데이터를 돌려받을 수 있습니까?
롤백 옵션은 없으며(Rollback은 MongoDB 컨텍스트에서 의미가 다릅니다), 엄밀히 말하면 이러한 문서를 다시 가져올 수 있는 지원되는 방법은 없습니다. 사용자가 취할 수 있거나 취해야 할 예방 조치는 댓글에 설명되어 있습니다.그러나 복제본 세트를 실행 중인 경우 단일 노드 복제본 세트도 사용할 수 있습니다.oplog
문서가 삽입되었을 때 커버를 씌우면 복구할 수 있습니다.
이를 설명하는 가장 쉬운 방법은 예제를 사용하는 것입니다.복원해야 하는 100개의 삭제된 문서에 대한 단순화된 예를 사용합니다.이를 넘어서기 위해서는 코드를 변경하여 커서 위에서 반복하거나 MongoDB 셸 밖에서 원하는 언어를 사용하여 작성해야 합니다.기본 논리는 그대로입니다.
foo
dropTest
우리는 100개의 문서를 삽입할 것입니다.name
및 동일한 드및동 개문서 name
나중에 실수로 제거할 수 있는 필드:
use dropTest;
for(i=0; i < 100; i++){db.foo.insert({_id : i})};
for(i=100; i < 200; i++){db.foo.insert({_id : i, name : "some_x_name"})};
로 100파운드, 100파운드, 100파운드를 한 것을 name
문서:
> db.foo.remove({ "name" : "some_x_name"})
WriteResult({ "nRemoved" : 100 })
복제본 집합에서 실행되고 있기 때문에 이러한 문서에 대한 기록은 여전히 다음 문서에 있습니다.oplog
중) 도 그 은 (oplog
(그)oplog
캡션 컬렉션임을 기억하십시오).그들을 찾을 수 있는지 봅시다.
use local;
db.oplog.rs.find({op : "i", ns : "dropTest.foo", "o.name" : "some_x_name"}).count();
100
숫자가 맞는 것 같습니다, 아직 서류가 남아 있는 것 같습니다.나는 경험을 통해 그것의 유일한 조각을 알고 있습니다.oplog
로 하는 은 우가여필하엔는는트리요입니다.o
필드, 따라서 다음만 반환하는 투영을 추가합니다(간단하게 요약하기 위해 생략된 출력이지만 아이디어를 얻을 수 있습니다).
db.oplog.rs.find({op : "i", ns : "dropTest.foo", "o.name" : "some_x_name"}, {"o" : 1});
{ "o" : { "_id" : 100, "name" : "some_x_name" } }
{ "o" : { "_id" : 101, "name" : "some_x_name" } }
{ "o" : { "_id" : 102, "name" : "some_x_name" } }
{ "o" : { "_id" : 103, "name" : "some_x_name" } }
{ "o" : { "_id" : 104, "name" : "some_x_name" } }
이러한 문서를 다시 삽입하려면 배열에 저장한 다음 배열 위에 반복하여 관련 문서를 삽입하면 됩니다.먼저 어레이를 생성해 보겠습니다.
var deletedDocs = db.oplog.rs.find({op : "i", ns : "dropTest.foo", "o.name" : "some_x_name"}, {"o" : 1}).toArray();
> deletedDocs.length
100
다음으로 컬렉션에 100개의 문서만 있음을 상기한 다음 100개의 삽입을 루프하고 마지막으로 카운트를 다시 확인합니다.
use dropTest;
db.foo.count();
100
// simple for loop to re-insert the relevant elements
for (var i = 0; i < deletedDocs.length; i++) {
db.foo.insert({_id : deletedDocs[i].o._id, name : deletedDocs[i].o.name});
}
// check total and name counts again
db.foo.count();
200
db.foo.count({name : "some_x_name"})
100
여기에 몇 가지 주의 사항이 있습니다.
- 이는 진정한 복원 전략이 아닙니다. 코멘트에 언급된 것처럼 백업(MMS, 기타) 및 지연된 보조 시스템을 살펴보십시오.
- 사용량이 많은 대형 시스템에서는 oplog에서 문서를 쿼리하는 것이 특별히 빠르지 않습니다(모든 oplog 쿼리는 테이블 스캔입니다).
- 문서가 언제든지 oplog에서 만료될 수 있습니다(물론 나중에 사용할 수 있도록 oplog의 복사본을 만들어 더 많은 시간을 제공할 수 있습니다).
- 워크로드에 따라 결과를 다시 삽입하기 전에 결과의 중복을 제거해야 할 수 있습니다.
- 더 큰 문서 집합은 표시된 것처럼 배열에 비해 너무 크기 때문에 커서 위에서 반복해야 합니다.
- 의
oplog
언제든지 될 수 , 하십시오. 따라서 사용자의 책임 하에 사용하십시오.
저는 이것이 조금 오래된 것이라는 것을 이해하지만, 비슷한 문제를 가진 다른 사람들에게 유용할 수 있는 이 분야에서 제가 조사한 것을 공유하고 싶었습니다.
실제로 MongoDB는 데이터를 즉시 물리적으로 삭제하지 않고 삭제 표시만 합니다.그러나 이는 버전별로 다르며 현재 문서화나 표준화는 없습니다. 이를 통해 타사 툴 개발자(또는 절실히 필요한 사용자)가 툴을 구축하거나 버전 간에 안정적으로 작동하는 간단한 스크립트를 작성할 수 있습니다.저는 이것을 위해 티켓을 열었습니다 - https://jira.mongodb.org/browse/DOCS-5151 .
저는 훨씬 낮은 수준에서 사용된 MongoDB 버전을 기반으로 미세 조정이 필요할 수 있는 한 가지 옵션을 조사했습니다.대부분의 사람들이 연결하기에는 당연히 너무 낮은 수준이지만, 작동하고 다른 모든 것이 실패할 때 유용할 수 있습니다.
제 접근 방식은 파일의 이진 파일로 직접 작업하고 Python 스크립트(또는 명령)를 사용하여 삭제된 데이터를 식별, 읽기 및 압축 풀기(BSON)하는 것입니다.
제 접근 방식은 이 GitHub 프로젝트에서 영감을 받았습니다(저는 이 프로젝트의 개발자가 아닙니다).여기 제 블로그에서 저는 스크립트를 단순화하고 Raw MongoDB 파일에서 특정 삭제된 레코드를 추출하려고 노력했습니다.
현재 레코드가 "로 삭제 표시되어 있습니다.\xee
레코드의 첫머리에이것이 Raw db 파일에서 삭제된 레코드의 모습입니다.
‘\xee\xee\xee\xee\x07_id\x00U\x19\xa6g\x9f\xdf\x19\xc1\xads\xdb\xa8\x02name\x00\x04\x00\x00\x00AAA\x00\x01marks\x00\x00\x00\x00\x00\x00@\x9f@\x00′
저는 첫 번째 블록을 다른 레코드를 기준으로 앞에서 확인한 레코드의 크기로 교체했습니다.
y=”3\x00\x00\x00″+x[20804:20800+51]
마지막으로 BSON 패키지(파이몬고와 함께 제공됨)를 사용하여 이진을 Readable 개체로 디코딩했습니다.
bson.decode_all(y)
[{u’_id': ObjectId(‘5519a6679fdf19c1ad73dba8′), u’name': u’AAA’, u’marks': 2000.0}]
이 BSON은 이제 python 개체이며 복구 컬렉션에 덤프하거나 단순히 어딘가에 기록할 수 있습니다.
데이터베이스 파일의 백업 복사본에 있는 준비 영역에서 이러한 복구 기술이나 다른 복구 기술을 수행하는 것이 이상적임은 두말할 필요도 없습니다.
언급URL : https://stackoverflow.com/questions/25802786/is-there-any-way-to-recover-recently-deleted-documents-in-mongodb
'programing' 카테고리의 다른 글
Getter는 함수여야 하지만 "getters.doubleCounter"는 20 - VUEX 오류입니다. (0) | 2023.06.28 |
---|---|
Vuex 스토어 상태가 변형될 때 Vue App 상태가 업데이트되지 않음 (0) | 2023.06.28 |
여러 개의 문을 어떻게 한 줄에 넣을 수 있습니까? (0) | 2023.06.23 |
Vuex가 일부 데이터를 구성 요소로 반환하는 중 (0) | 2023.06.23 |
삽입이 성공하지 못한 경우 기본 키 증가를 방지하시겠습니까? (0) | 2023.06.23 |