복붙노트

[MONGODB] MongoDB를 데이터베이스 파일 크기를 감소

MONGODB

MongoDB를 데이터베이스 파일 크기를 감소

나는 (> 3기가바이트)를 한 번 큰이었다 MongoDB의 데이터베이스를 가지고있다. 그 이후로, 문서가 삭제 된 나는 그에 따라 감소하는 데이터베이스 파일의 크기를 예상하고 있었다.

MongoDB를이 할당 된 공간을 유지하지만 이후, 파일은 여전히 ​​크다.

여기 읽고 admin 명령은 --repair가 사용되지 않는 공간을 확보하는 데 사용됩니다,하지만이 명령을 실행하려면 디스크에 충분한 공간이없는이 mongod있다.

당신은 내가 사용하지 않는 공간을 해제 할 수있는 방법을 알고 계십니까?

해결법

  1. ==============================

    1.업데이트 : 여분의 디스크 공간이 실제로 OS에 공개 될 것 같은 컴팩트 명령 WiredTiger으로 보인다.

    업데이트 : 여분의 디스크 공간이 실제로 OS에 공개 될 것 같은 컴팩트 명령 WiredTiger으로 보인다.

    UPDATE : 컴팩트 한 명령이 V1.9 +를 사용합니다.

    이 명령은 "인라인"는 압축을 수행합니다. 아직하지만만큼, 몇 가지 여분의 공간이 필요합니다.

    MongoDB를은으로 파일을 압축합니다 :

    당신은 mongod의 --repair을 실행하거나 ()에 직접 연결하고 db.repairDatabase를 실행하여 "압축"을 할 수 있습니다.

    어느 경우에는 파일을 복사 할 공간 어딘가에 필요합니다. 당신이 압축을 수행 할 수있는 공간이 충분하지 않은 이유를 이제 난 당신이 더 많은 공간에 다른 컴퓨터가있는 경우 그러나, 당신은 몇 가지 옵션이 있습니까, 모르겠어요.

    몽고를 사용하여 "대신에 소형"에 좋은 방법은 현재 없습니다. 그리고 몽고는 확실히 공간을 많이 빨아 수 있습니다.

    가장 좋은 전략은 지금 압축을위한 마스터 - 슬레이브 설정을 실행하는 것입니다. 그런 다음, 슬레이브를 압축이 잡을 그들을 전환하도록 할 수 있습니다. 나는 아직도 약간의 털이 알고있다. 아마 몽고 팀은 장소 압축 더 나은 함께 올 것이다,하지만 난 그것을 자신의 목록에있는 고 생각하지 않습니다. 드라이브 공간이 현재 싼 것으로 가정 (그리고 일반적으로)된다.

  2. ==============================

    2.저도 같은 문제를 겪고, 단순히 명령 줄에서이 일을 해결 :

    저도 같은 문제를 겪고, 단순히 명령 줄에서이 일을 해결 :

    mongodump -d databasename
    echo 'db.dropDatabase()' | mongo databasename
    mongorestore dump/databasename
    
  3. ==============================

    3.그것은 몽고의 V1.9 + 장소에서 소형에 대한 지원을하고있다처럼 보인다!

    그것은 몽고의 V1.9 + 장소에서 소형에 대한 지원을하고있다처럼 보인다!

    > db.runCommand( { compact : 'mycollectionname' } )
    

    여기에 문서를 참조하십시오 http://docs.mongodb.org/manual/reference/command/compact/

    "repairDatabase 달리 컴팩트 명령은 일을 두 번 디스크 공간을 필요로하지 않습니다. 작업하면서 추가 공간이 소량을 필요로 않습니다. 또한, 컴팩트 빠릅니다."

  4. ==============================

    4.현재 데이터베이스의 모든 컬렉션을 압축

    현재 데이터베이스의 모든 컬렉션을 압축

    db.getCollectionNames().forEach(function (collectionName) {
        print('Compacting: ' + collectionName);
        db.runCommand({ compact: collectionName });
    });
    
  5. ==============================

    5.당신은 전체 복구를 실행해야하는 경우 repairpath 옵션을 사용합니다. 더 사용할 수있는 공간이있는 디스크를 가리 킵니다.

    당신은 전체 복구를 실행해야하는 경우 repairpath 옵션을 사용합니다. 더 사용할 수있는 공간이있는 디스크를 가리 킵니다.

    예를 들어, 내 맥 I에 사용했습니다 :

    mongod --config /usr/local/etc/mongod.conf --repair --repairpath /Volumes/X/mongo_repair
    

    업데이트 : 당 MongoDB를 코어 서버는 티켓 4266, 오류를 피하기 위해 --nojournal 추가해야합니다 :

    mongod --config /usr/local/etc/mongod.conf --repair --repairpath /Volumes/X/mongo_repair --nojournal
    
  6. ==============================

    6.몽고의 2.8 버전부터는 압축을 사용할 수 있습니다. 당신은 (압축을 제공하지 않습니다 2.6에서 기본값은) WiredTiger 엔진의 mmap와 압축의 3 단계를해야합니다 :

    몽고의 2.8 버전부터는 압축을 사용할 수 있습니다. 당신은 (압축을 제공하지 않습니다 2.6에서 기본값은) WiredTiger 엔진의 mmap와 압축의 3 단계를해야합니다 :

    다음은 데이터 16GB의를 위해 저축 할 수있는 공간의 예입니다 :

    데이터는이 문서에서 가져옵니다.

  7. ==============================

    7.우리는 StorageEngine에 따라 2 가지 방법으로 해결할 필요가있다.

    우리는 StorageEngine에 따라 2 가지 방법으로 해결할 필요가있다.

    1. MMAP () 엔진 :

    명령 db.repairDatabase ()

    참고 : repairDatabase 현재 데이터 세트 플러스 2기가바이트의 크기에 해당하는 여유 디스크 공간이 필요합니다. DBPATH를 보유하고 볼륨 충분한 공간이 부족한 경우, 그 수리에 대한 별도의 볼륨 및 사용을 마운트 할 수 있습니다. repairDatabase에 대해 별도의 볼륨을 장착 할 때 명령 줄에서 repairDatabase을 실행 및 임시 복구 파일을 저장할 폴더를 지정합니다 --repairpath 스위치를 사용해야합니다. 예를 들면 : DB 크기가 +2 = 2백42기가바이트 하드 디스크 공간이 필요한 120 개 기가 바이트 수단 (* 2 (120))입니다 상상해보십시오.

    당신이 현명한 수집을 할 수있는 또 다른 방법, 명령 db.runCommand ({컴팩트 'collectionName 사용'})

    2. WiredTiger :          그것은 자동으로 자아를 해결.

  8. ==============================

    8.이 MongoDB의 공간 교정을 통해 일부 상당한 혼란하고, 일부 권장되는 방법은 특정 배포 유형에서 할 명백히 위험했다. 자세한 내용은 아래 :

    이 MongoDB의 공간 교정을 통해 일부 상당한 혼란하고, 일부 권장되는 방법은 특정 배포 유형에서 할 명백히 위험했다. 자세한 내용은 아래 :

    TL; DR은 디스크 손상 복구하려고 독립 MongoDB를 배포에서인양 데이터에 대한 시도를 repairDatabase. 이 공간을 복구하는 경우, 그것은 순전히 부작용이다. 공간을 복구하는 repairDatabase를 실행의 주요 고려 사항 않을 것입니다.

    WiredTiger은 : WiredTiger와 독립형 노드의 경우, 하나주의해야 할 점으로는 OS에 공간을 출시 할 예정 컴팩트를 실행 : MongoDB를 3.0.x에에 WiredTiger의 컴팩트 한 명령은이 버그의 영향을받은 : SERVER-21833 MongoDB를 3.2.3에서 수정되었습니다. 이 버전 이전에, WiredTiger에 컴팩트 자동으로 실패 할 수 있습니다.

    MMAPv1 : 인해 MMAPv1가 작동하는 방식 때문에, MMAPv1 스토리지 엔진을 사용하여 공간을 복구 할 수있는 안전하고 지원되는 방법이 없습니다. 잠재적으로 새 문서에 대한 더 많은 공간을 사용할 수 있도록 데이터 파일을 조각 모음 할 MMAPv1에 압축,하지만 OS에 공간 등을 공개하지 않습니다.

    repairDatabase은 본질적으로 손상된 문서를 폐기하여 전체 데이터베이스를 다시 작성하기 때문에 완전히 (아래 참조)이 잠재적으로 위험한 명령의 결과를 이해한다면 당신은 repairDatabase를 실행할 수 있습니다. 부작용으로, 이것은 그것과 OS에 릴리스 공간 뒷면에 어떤 분열없이 새로운 MMAPv1 데이터 파일을 생성합니다.

    덜 모험 방법의 경우, mongodump 및 mongorestore를 실행하면 배포의 크기에 MMAPv1 배포, 주제에뿐만 아니라 가능하다.

    복제 세트 구성의 경우, 최고의 공간을 복구하는 가장 안전한 방법은 WiredTiger 및 MMAPv1 모두 초기 동기화를 수행하는 것입니다.

    당신이 세트의 모든 노드에서 공간을 복구해야하는 경우 롤링 초기 동기화를 수행 할 수 있습니다. 즉, 이전에 마지막 주 강압 상기 보조 노드의 각각의 초기 동기화를 수행하고 그것의 초기 동기화를 수행한다. 초기 동기화 방법 롤링 복제 설정 유지 보수를 수행하는 가장 안전한 방법이며, 또한 보너스로 다운 타임을 포함하지 않습니다.

    롤링 초기 동기화를 수행의 가능성도 배포의 크기에 따라 달라집니다 있습니다. 매우 큰 배포의 경우, 초기 동기화를 할 가능하지 않을 수 있으며, 따라서 귀하의 옵션은 다소 제한됩니다. WiredTiger를 사용하는 경우, 설정 한 보조 출력을 독립적으로 시작할 수 있습니다, 그것은 컴팩트 실행하고 다시 참가 세트에.

    복제 세트의 노드에서 repairDatabase를 실행하지 않는주십시오. repairDatabase 페이지에 언급 된 자세한 내용은 아래에 설명 된대로 이것은 매우 위험합니다.

    이름의 repairDatabase는 명령이 수리 아무것도 시도하지 않기 때문에 조금, 오해의 소지가있다. 이 명령은 손상된 문서로 이어질 수있는 독립형 노드에 디스크 손상이있을 때 사용하기위한되었다.

    repairDatabase 명령은 더 정확하게 "인양 데이터베이스"로 설명 할 수있다. 즉, 당신이 그것을 시작하고 그것에서 그대로 문서를 회수 할 수있는 상태로 데이터베이스를 얻기 위해 시도 손상된 문서를 폐기하여 데이터베이스를 재현한다.

    MMAPv1가 배포의 경우,이 부작용으로 OS 데이터베이스 파일 자료 공간의 재건. 운영 체제에 공간을 떼면 목적 결코 없었다.

    복제 세트에서 MongoDB를이 세트의 모든 노드가 동일한 데이터를 포함 할 예정이다. 당신이 복제 세트의 노드에서 repairDatabase를 실행하는 경우,이 노드가 발견되지 않은 손상을 포함 기회이며, repairDatabase은 충실하게 당신을 위해 손상된 문서를 제거합니다.

    예상대로,이 노드가 세트의 나머지 부분에서 다른 데이터 집합을 포함합니다. 업데이트가 그 하나의 문서를 공격 발생하면, 전체 세트는 충돌 할 수있다.

    메이크업 악화 문제에,이 상황이 오랫동안 휴면 머물 수 만 뚜렷한 이유 갑자기 공격하는 것이 전적으로 가능하다.

  9. ==============================

    9.그것은 다른 데이터베이스 또는 컬렉션을 사용할 수 있도록 경우 데이터의 큰 덩어리가 콜렉션에서 삭제되고 컬렉션이 결코 새 문서에 대한 삭제 된 공간을 사용하지 않고,이 공간 요구 사항은 운영 체제에 반환합니다. 당신은 사용 가능한 여유 공간이 디스크 공간을 조각 모음하고 회복하기 위해 소형 또는 수리 작업을 실행해야합니다.

    그것은 다른 데이터베이스 또는 컬렉션을 사용할 수 있도록 경우 데이터의 큰 덩어리가 콜렉션에서 삭제되고 컬렉션이 결코 새 문서에 대한 삭제 된 공간을 사용하지 않고,이 공간 요구 사항은 운영 체제에 반환합니다. 당신은 사용 가능한 여유 공간이 디스크 공간을 조각 모음하고 회복하기 위해 소형 또는 수리 작업을 실행해야합니다.

    다음과 같이 압축 과정의 행동 MongoDB를 엔진에 의존

    db.runCommand({compact: collection-name })
    

    MMAPv1

    다짐 작업은 데이터 파일 및 인덱스를 조각 모음. 그러나 운영 체제에 공간을 해제하지 않습니다. 작업은 여전히 ​​조각 모음 및 MongoDB에 의해 재사용을 위해 더 연속 공간을 만들 때 유용합니다. 그러나, 사용 가능한 디스크 공간이 매우 부족하면하지만 아무 소용이입니다.

    2GB의 추가 디스크 공간 위로는 압축 작업을 수행하는 동안 필요합니다.

    데이터베이스 수준 잠금은 압축 작업을 수행하는 동안 개최됩니다.

    WiredTiger

    WiredTiger 엔진은 MMAPv1보다 적은 디스크 공간을 사용 기본적으로 압축을 제공합니다.

    컴팩트 과정은 운영 체제에 여유 공간을 해제합니다. 최소 디스크 공간은 컴팩트 작업을 실행하는 데 필요합니다. WiredTiger의 또한 블록은 데이터베이스 레벨의 잠금을 필요로 데이터베이스에 대한 모든 작업.

    MMAPv1 엔진, 컴팩트는 운영 시스템에 공간을 반환하지 않습니다. 당신은 사용되지 않는 공간을 해제하기 위해 복구 작업을 실행하는 데 필요합니다.

    db.runCommand({repairDatabase: 1})
    
  10. ==============================

    10.MongoDB를 3.0 이상에서는 새 스토리지 엔진을 가지고 - WiredTiger. 100 기가에서 25 기가 바이트에 내 경우 스위칭 엔진 감소 디스크 사용합니다.

    MongoDB를 3.0 이상에서는 새 스토리지 엔진을 가지고 - WiredTiger. 100 기가에서 25 기가 바이트에 내 경우 스위칭 엔진 감소 디스크 사용합니다.

  11. ==============================

    11.데이터베이스 파일의 크기가 감소 될 수 없다. 데이터베이스를 "수리"하는 동안 몽고 서버가 일부 파일을 삭제하는 것은에만 가능합니다. 많은 양의 데이터가 삭제 된 경우, 몽고 서버는 "릴리스", 수리하는 동안, 기존 파일의 일부를 (삭제)됩니다.

    데이터베이스 파일의 크기가 감소 될 수 없다. 데이터베이스를 "수리"하는 동안 몽고 서버가 일부 파일을 삭제하는 것은에만 가능합니다. 많은 양의 데이터가 삭제 된 경우, 몽고 서버는 "릴리스", 수리하는 동안, 기존 파일의 일부를 (삭제)됩니다.

  12. ==============================

    12.일반적으로 소형에서 repairDatabase하는 것이 바람직하다. 하지만 소형 이상의 수리 중 하나 장점은 전체 클러스터에 수리를 발행 할 수있다. 당신이 어떤 성가신의 각 샤드에 로그인 할 필요가 압축.

    일반적으로 소형에서 repairDatabase하는 것이 바람직하다. 하지만 소형 이상의 수리 중 하나 장점은 전체 클러스터에 수리를 발행 할 수있다. 당신이 어떤 성가신의 각 샤드에 로그인 할 필요가 압축.

  13. ==============================

    13.내가 같은 문제가 있었을 때, 난 내 MongoDB의 서버를 중지 명령으로 다시 시작

    내가 같은 문제가 있었을 때, 난 내 MongoDB의 서버를 중지 명령으로 다시 시작

    mongod --repair
    

    당신이 확인해야 복구 작업을 실행하기 전에하는 것은 당신이 당신의 하드 디스크에 충분한 여유 공간이 할 (분 - 데이터베이스의 크기입니다)

  14. ==============================

    14.MongoDB의의 -repair이 분산됩니다 클러스터의 경우에는 사용하지 않는 것이 좋습니다.

    MongoDB의의 -repair이 분산됩니다 클러스터의 경우에는 사용하지 않는 것이 좋습니다.

    복제 세트 분산됩니다 클러스터를 사용하는 경우, 컴팩트 명령을 사용하여, 그것은 것입니다 다시 작성 및 조각 모음을 모든 컬렉션의 모든 데이터와 인덱스 파일을. 통사론:

    db.runCommand( { compact : "collection_name" } )
    

    복제 세트의 차에 진정한 컴팩트 실행 : 힘을 사용하는 경우. 예를 들면 db.runCommand ({명령 : "COLLECTION_NAME"힘 : TRUE})

    다른 점은 고려해야 할 - 그것은 블록 작업. 그래서 유지 관리 창에서 실행하는 것이 좋습니다. 복제 세트가 서로 다른 서버에서 실행 - 만약 별도로 각 부재에 실행해야 - 분산됩니다 클러스터의 경우, 소형의 요구는 별도로 각 샤드 멤버를 실행합니다. mongos 인스턴스에 대해 실행할 수 없습니다.

  15. ==============================

    15.독립형 모드의 경우, 소형 또는 수리 사용할 수 있습니다

    독립형 모드의 경우, 소형 또는 수리 사용할 수 있습니다

    소형 이차 다음에 당신이 차에 소형 실행 후 내 경험에 분산됩니다 클러스터 또는 복제 세트,,,를 들어, 기본 데이터베이스의 크기는 감소하지만, 보조 없습니다. 당신은 보조 데이터베이스의 크기를 줄이기 위해 재 동기화 회원을 수행 할 수 있습니다. 이 작업을 수행하여 당신은 내가 정말 컬렉션을 압축하지 컴팩트 명령을 추측, 보조 데이터베이스의 크기가 훨씬 더 차보다 감소 될 수도 있습니다. 그래서, 나는이 기본 및 복제 세트의 보조 전환하고 다시 재 동기화 구성원을하고 끝났다.

    내 결론은 분산됩니다 / 복제 세트의 크기를 줄일 수있는 가장 좋은 방법은 재 동기화 멤버를 수행하여입니다이며, 1 차, 2 차 전환하고 다시 재 동기화.

  16. ==============================

    16.나는 그것을 할 수 있었다 그냥 하나의 방법. 기존 데이터의 안전에 대한 보장이 없습니다. 자신의 위험을보십시오.

    나는 그것을 할 수 있었다 그냥 하나의 방법. 기존 데이터의 안전에 대한 보장이 없습니다. 자신의 위험을보십시오.

    직접 데이터 파일과 다시 시작 mongod를 삭제합니다.

    예를 들어, 우분투 (데이터에 대한 기본 경로의 경우 : / var / lib 디렉토리 / MongoDB를), I는 같은 이름을 가진 두 파일을 가지고 :. 모음 #. 나는 collection.0을 유지하고 나머지는 모두 삭제.

    당신이 데이터베이스에 심각한 데이터가없는 경우 쉬운 방법을 보인다.

  17. from https://stackoverflow.com/questions/2966687/reducing-mongodb-database-file-size by cc-by-sa and MIT license