[mongodb] 삭제한 데이터만큼 용량이 줄어들지 않는 문제
몽고디비를 캐시서버 역할로 사용중이다.
약 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
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기가 아꼈슴 ㅎㅎ