DataBase/mongodb

[mongodb] 삭제한 데이터만큼 용량이 줄어들지 않는 문제

Satisfaction 2022. 1. 31. 04:15

몽고디비를 캐시서버 역할로 사용중이다.

 

약 1년쯤 되었는데, 상당한 용량이 쌓여 오랫동안 사용되지 않은 데이터는 정리했다.

 

# mongo shell

use DB_NAME

db.COLLECTION.deleteMany(...);

대략 이런 느낌으로 해서 6달 이상 사용되지 않은 데이터 약 100~200만개를 삭제했다.

 

그런데 삭제가 완료되었음에도 디스크 용량을 뱉어내질 않는다.

 

몽고디비는 공간이 남더라도 이후 쓰여질 document를 위해 disk space를 반환하지 않는다고 한다.

 

디스크 용량 회수

use DB_NAME

db.runCommand({ compact: 'COLLECTION_NAME' });

을 사용하여 해당 컬렉션의 비어 있는 디스크 공간을 회수할 수 있다.

 

이것을 모든 컬렉션에 대해 반복하려면 

 

use DB_NAME

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

 

위 코드를 사용한다.

 

작업 시간이 꽤 오래 걸리고, 자원도 많이 먹으니 주의하자.

권한 오류

compact 작업은 dbAdmin 권한을 요구한다.

 

따라서, 권한 오류가 발생했다면 두 가지 옵션을 고려해볼 수 있다.

 

1. 사용중인 계정에 dbAdmin권한 부여

 

다만 1번 옵션은 계정의 권한을 제어할 수 있는 계정(이하 슈퍼계정)이 이미 있고, 접근 가능한 상태여야 한다.

 

슈퍼계정으로 접속하고, 몽고 쉘에서 아래 코드를 실행한다.

use admin
db.grantRolesToUser("TARGET_USER", [ "dbAdmin" ] )

(TARGET_USER는 원래 사용하던 계정)

다시 TARGET_USER로 접속하고 난 후 compact를 실행시킨다.

 

https://docs.mongodb.com/manual/reference/command/compact/#compact-required-privileges

 

compact — MongoDB Manual

Docs Home → MongoDB ManualcompactRewrites and defragments all data and indexes in a collection. On WiredTiger databases, this command will release unneeded disk space to the operating system.compact has the following form:{ compact: }compact takes the fo

docs.mongodb.com

 

2. security 일시적 비활성화

 

mongodb를 설치하고 mongod.conf에서 security를 설정했다면 일시적으로 해제해 줄 수도 있다.

 

/etc/mongod.conf 를 열어서 수정한다.

 

...
net:
  port: 27017
  #보안기능을 잠시 끄는 것이므로 로컬에서만 접속할 수 있도록 한다
  bindIp: 127.0.0.1
  #bindIp: 0.0.0.0
...

#security 관련 옵션도 모두 주석처리한다
#security:
  #authorization: 'enabled'

그리고 나서 몽고를 재시작한다.

 

sudo service mongod restart

이제 compact 작업을 자유롭게 사용할 수 있다.

 

사용이 끝난 후에는 다시 mongod.conf를 원래대로 돌려놓고, 몽고를 재시작해 주자.

 

그냥 무지성으로 몽고디비썼다가 날밤새는중이다...

 

그래도 이걸로 20기가 아꼈슴 ㅎㅎ