MongoDB 데이터 삭제 후 디스크 반환 방법

MongoDB에서 remove()로 컬렉션의 데이터를 삭제하더라도 디스크 공간은 반환되지 않는다. 그 공간을 비워놓고 새로운 데이터가 들어올 때 그대로 사용한다. 대부분의 DBMS가 데이터를 효율적으로 처리하기 위해 이런 구조로 이루어져 있다.

remove() 후에 compact 또는 repairDatabase 같은 명령어로 디스크를 반환할 수 있는 방법이 있지만 이 방법은 디스크를 반환하는 대상 컬렉션 용량만큼의 여유 공간이 필요하다는 단점이 있다. 예를 들어, 이미 OS 디스크 용량이 90%를 넘어서 어쩔 수 없이 데이터를 삭제해야 하는 상황이면 compact나 repairDatabase는 무용지물이다.

이런 상황에선 컬렉션의 데이터를 삭제하고 삭제 후의 db를 백업한 뒤에 db를 삭제하고 다시 복원하는 방식이 유효할 수 있다. 다만 이 방법도 백업본을 생성할 수 있는 마운트된 디스크가 필요하다.

MongoDB 데이터 삭제 및 디스크 반환

1. (선택) 전체 DB 백업

여건이 어렵다면 어쩔 수 없지만 가능하다면 작업 전 전체 DB 백업을 해두는 게 권장된다.

# 전체 데이터 백업 (혹시를 대비해 전체 백업 수행)
mongodump --db mydb --out /mount/data/backup_before_delete

2. 컬렉션 데이터 삭제

컬렉션의 데이터를 삭제한다.

// 삭제 기준일: 2023-12-31 이전
db.userlogs.remove({"loginTime": {$lt: ISODate("2023-12-31T15:00:00.000Z")}});
db.transactions.remove({"createdAt": {$lt: ISODate("2023-12-31T15:00:00.000Z")}});
db.errorreports.remove({"reportedAt": {$lt: ISODate("2023-12-31T15:00:00.000Z")}});

데이터 삭제가 되더라도 물리적 디스크 공간은 반환되지 않는다.

3. 삭제 후 DB 백업

데이터가 삭제된 이후 데이터를 백업한다. 데이터가 삭제된 만큼 백업 파일의 용량도 줄어든다.

mongodump --db mydb --out /mount/data/backup_after_delete

4. 기존 DB 삭제

백업이 정상적으로 이루어진 것이 확인되면 전체 DB를 삭제한다.

use mydb
db.dropDatabase()

5. 백업본 복원

컬렉션을 삭제하고 백업했던 파일을 이용해서 DB를 복원한다.

mongorestore --db mydb /mount/data/backup_after_delete/mydb

6. 디스크 회수 확인

모든 작업이 완료되면 디스크가 잘 회수되었는지 확인한다.

# 리눅스 기준
# 디스크 사용량 확인
df -h

# MongoDB 데이터 디렉토리 용량 확인
du -sh /var/lib/mongodb  # mongodb 데이터 저장 경로

댓글 남기기