MongoDB에서 공간 회수에 대해 상당한 혼란이 있었고 일부 권장 사례는 특정 배포 유형에서 매우 위험합니다. 자세한 내용은 아래를 참조하십시오.
TL; DR repairDatabase 은 디스크 손상으로부터 복구하려고하는 독립 실행 형 MongoDB 배치에서 데이터를 복구하려고 시도합니다. 공간을 복구하면 순전히 부작용 입니다. 공간 복구는 절대로 실행을 고려해야합니다 repairDatabase.
독립형 노드에서 공간 복구
WiredTiger : WiredTiger 를 사용하는 독립형 노드의 경우 실행시 compact한 가지 경고와 함께 OS에 공간이 해제 compact됩니다. MongoDB 3.0.x의 WiredTiger 명령은 다음 버그의 영향을받습니다. SERVER-21833 : MongoDB 3.2.3에서 수정되었습니다. 이 버전 이전에는 compactWiredTiger에서 자동으로 실패 할 수있었습니다.
MMAPv1 : MMAPv1 작동 방식으로 인해 MMAPv1 스토리지 엔진을 사용하여 공간을 복구하는 안전하고 지원되는 방법이 없습니다. compactMMAPv1에서는 데이터 파일 조각 모음을 수행하여 새 문서에 더 많은 공간을 사용할 수 있지만 OS에 공간을 다시 제공하지는 않습니다.
당신은 할 수있다 실행할 수 repairDatabase완전히 이것의 결과 이해하는 경우 잠재적으로 위험한 명령을하기 때문에, (아래 참조)repairDatabase 기본적으로 손상된 문서를 폐기하여 전체 데이터베이스를 다시 작성합니다. 부작용으로 새로운 MMAPv1 데이터 파일이 조각화되지 않고 OS에 공간이 다시 제공됩니다.
덜 모험 방법, 실행 mongodump하고하는 것은 mongorestore배포의 크기에 MMAPv1 배포, 주제에뿐만 아니라 가능하다.
복제 세트에서 공간 복구
복제 세트 구성의 경우 공간을 복구하는 가장 안전하고 안전한 방법은 WiredTiger와 MMAPv1 모두에 대해 초기 동기화 를 수행하는 것입니다.
세트의 모든 노드에서 공간을 복구해야하는 경우 롤링 초기 동기화를 수행 할 수 있습니다. 즉, 각 보조 노드에서 초기 동기화를 수행 한 후 최종적으로 기본 서버를 종료하고 초기 동기화를 수행하십시오. 롤링 초기 동기화 방법은 복제본 세트 유지 관리를 수행하는 가장 안전한 방법이며, 다운 타임을 추가로 포함하지 않습니다.
롤링 초기 동기화 수행 가능성은 배포 크기에 따라 다릅니다. 대규모 배포의 경우 초기 동기화를 수행 할 수 없으므로 옵션이 다소 제한적입니다. WiredTiger를 사용하는 경우, 당신은 할 수있다 , 세트의 하나 차 밖으로을 운영하는 독립형으로 시작할 수 compact그것을하고 세트에 다시 가입.
에 관해서 repairDatabase
repairDatabase복제 세트 노드에서 실행하지 마십시오 . repairDatabase 페이지 에서 언급했듯이 이것은 매우 위험 합니다 아래에서 더 자세히 설명 합니다.
repairDatabase명령이 아무것도 수리하려고 시도하지 않기 때문에 이름 이 약간 오도됩니다. 이 명령은 독립형 노드 에서 디스크가 손상되어 문서가 손상 될 수있는 경우에 사용되었습니다.
이 repairDatabase명령은 "salvage database"로보다 정확하게 설명 될 수 있습니다. 즉, 데이터베이스를 시작하고 손상되지 않은 문서를 구할 수있는 상태로 데이터베이스를 가져 오려는 시도에서 손상된 문서를 버려서 데이터베이스를 다시 작성합니다.
MMAPv1 배포에서 데이터베이스 파일의 이러한 재구성은 부작용으로 OS에 공간을 해제합니다 . OS 공간을 확보하는 것이 결코 목적이 아니 었습니다.
repairDatabase복제 세트에 대한 결과
복제 세트에서 MongoDB는 세트의 모든 노드가 동일한 데이터를 포함 할 것으로 예상합니다. repairDatabase복제 세트 노드에서 실행 하는 경우 노드에 감지되지 않은 손상이 포함되어있을 수 repairDatabase있으며 손상된 문서를 적절하게 제거합니다.
예상대로 노드에 나머지 세트와 다른 데이터 세트가 포함되어 있습니다. 업데이트가 해당 단일 문서에 도달하면 전체 세트가 충돌 할 수 있습니다.
설상가상으로,이 상황이 오랫동안 휴면 상태에있을 수 있으며 명백한 이유없이 갑자기 공격 할 수 있습니다.