[mongodb] MongoDB 데이터베이스 파일 크기 줄이기

한때 큰 (> 3GB) MongoDB 데이터베이스가 있습니다. 그 이후로 문서가 삭제되었으며 이에 따라 데이터베이스 파일의 크기가 줄어들 것으로 예상했습니다.

그러나 MongoDB는 할당 된 공간을 유지하므로 파일이 여전히 큽니다.

여기에서 admin 명령 mongod --repair이 사용되지 않은 공간을 비우는 데 사용 된다는 것을 읽었 지만 디스크 에이 명령을 실행하기에 충분한 공간이 없습니다.

사용하지 않는 공간을 확보 할 수있는 방법을 알고 있습니까?



답변

업데이트 :compact명령 같은 WiredTiger 그것은 본다 추가 디스크 공간이 실제로 OS에 발표 될 예정이다 .


업데이트 : v1.9 이상에서는 compact명령이 있습니다.

이 명령은 “인라인”압축을 수행합니다. 여전히 여분의 공간이 필요하지만 그다지 많지는 않습니다.


MongoDB는 다음을 통해 파일을 압축합니다.

  • 파일을 새 위치로 복사
  • 문서 반복 및 재주문 / 재 해결
  • 원본 파일을 새 파일로 교체

실행 mongod --repair하거나 직접 연결하고 실행 하여이 “압축”을 수행 할 수 있습니다 db.repairDatabase().

두 경우 모두 파일을 복사 할 공간이 필요합니다. 이제 압축을 수행하기에 충분한 공간이없는 이유를 모르겠지만 공간이 더 많은 다른 컴퓨터가있는 경우 몇 가지 옵션이 있습니다.

  1. 를 사용하여 Mongo가 설치된 다른 컴퓨터로 데이터베이스를 내 보낸 mongoexport다음 (를 사용하여 mongoimport) 동일한 데이터베이스를 가져올 수 있습니다 . 그러면 압축 된 새 데이터베이스가 생성됩니다. 이제 mongod새 데이터베이스 파일로 원래 바꾸기를 중지 할 수 있습니다 .
  2. 현재 mongod를 중지하고 데이터베이스 파일을 더 큰 컴퓨터에 복사 한 후 해당 컴퓨터에서 복구를 실행하십시오. 그런 다음 새 데이터베이스 파일을 원래 컴퓨터로 다시 이동할 수 있습니다.

현재 몽고를 사용하여 “컴팩트 한 위치에”적합한 방법은 없습니다. 그리고 몽고는 확실히 많은 공간을 빨아 들일 수 있습니다.

압축을위한 최고의 전략은 Master-Slave 설정을 실행하는 것입니다. 그런 다음 슬레이브를 압축하여 따라 잡고 전환 할 수 있습니다. 나는 아직도 약간 털이 알고 있습니다. 아마도 몽고 팀이 압축을 더 잘 할 수는 있지만 목록에서 높은 것으로 생각하지는 않습니다. 드라이브 공간은 현재 저렴하다고 가정합니다 (보통).


답변

나는 같은 문제를 겪었고 단순히 명령 줄 에서이 작업을 수행하여 해결했습니다.

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


답변

Mongo v1.9 +가 컴팩트를 지원하는 것처럼 보입니다!

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

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

“repairDatabase와 달리, 컴팩트 명령은 작업을 수행하기 위해 이중 디스크 공간이 필요하지 않습니다. 작업하는 동안 적은 양의 추가 공간이 필요합니다. 또한 컴팩트가 빠릅니다.”


답변

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

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


답변

전체 복구를 실행해야하는 경우 repairpath옵션을 사용하십시오 . 사용 가능한 공간이 더 많은 디스크를 가리 킵니다.

예를 들어, 내 Mac에서는 다음을 사용했습니다.

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

업데이트 : MongoDB Core Server Ticket 4266--nojournal따라 오류를 피하기 위해 추가해야 할 수도 있습니다 .

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


답변

Mongo 2.8 버전 부터 compression을 사용할 수 있습니다 . WiredTiger 엔진 인 mmap (2.6의 기본값은 압축을 제공하지 않음)을 사용하여 3 가지 압축 수준을 갖게됩니다.

다음은 16GB의 데이터를 저장할 수있는 공간의 예입니다.

여기에 이미지 설명을 입력하십시오

기사 에서 데이터를 가져옵니다 .


답변

StorageEngine을 기반으로 두 가지 방법을 풀어야합니다.

1. MMAP () 엔진 :

명령 : db.repairDatabase ()

참고 : repairDatabase에는 현재 데이터 세트 크기에 2GB를 더한 여유 디스크 공간이 필요합니다. dbpath를 보유한 볼륨에 충분한 공간이 없으면 별도의 볼륨을 마운트하고 복구에 사용할 수 있습니다. repairDatabase에 별도의 볼륨을 마운트 할 때는 명령 줄에서 repairDatabase를 실행하고 –repairpath 스위치를 사용하여 임시 복구 파일을 저장할 폴더를 지정해야합니다. 예 : DB 크기가 120GB를 의미한다고 가정하면 (120 * 2) +2 = 242GB 하드 디스크 공간이 필요합니다.

컬렉션을 현명하게 수행하는 다른 방법은 다음과 같습니다. db.runCommand ({compact : ‘collectionName’})

2. WiredTiger :
자동으로 자체 해결됩니다.