MySQL 용량정리 (Binary log 삭제)

2022. 3. 9. 11:52Dev

MySQL 서버를 운영하다보면, 로그 축적 등으로 용량이 부족하여 DB 연결에 에러가 생기는 경우가 종종 있다. 이 경우 일반적으로 Binary log 를 삭제해주는 방법을 생각해 볼 수 있다.

 

들어가기전에

  • MySQL를 Docker 이미지를 통해 사용중인 경우를 기준으로 설명한다. 
    꼭 Docker 버전에 국한된 것은 아니니 VM에 MySQL에 설치형으로 구축한 경우나 SaaS 경우에도 동일하게 적용 가능하다.
  • MySQL 이미지는 mysql:8 을 사용하였다.

 

Binary log 확인방법

먼저 나는 일반적으로 docker-compose 를 통해 컨테이너를 관리하는 걸 좋아해서 나의 MySQL docker-compose 를 먼저 간략히 보여드린다. 아주 심플한 구성이며 포트번호도 3306으로 기본 세팅이다.

 

보안이 필요한 부분은 좀 가렸다.

도커 컨테이너로 진입한다.

docker exec -it <container-id> mysql -u <mysql-id> -p

# 나같은 경우는 컨테이너ID는 55b86a7044b7, MySQL은 Root로 접근하려 하므로 아래와 같다.
# docker exec -it 55b86a7044b7 mysql -u root -p

 

현재 binary logs 를 확인해보자. 아래 명령어로 확인해보니 현재 2개의 로그가 있는 것을 알 수 있다.

show binary logs;

 

 

그럼, binary log의 보존기간을 확인해보자. 현재 나는 3,600초(1시간)으로 설정이 되어있다.

 show variables like 'binlog_expire%';

(참고) 예전에는 'expire_logs_days' 라는 변수로 보존기간을 관리했었는데 binlog_expire_logs_seconds 로 바뀐듯 하다.

 

binary log 보존기간은 아래와 같이 변경 가능하다. 1,800초(30분)으로 변경하니 정상적으로 변경된 것을 확인할 수 있다.

# 30분으로 변경
set global binlog_expire_logs_seconds=1800;

 

Binary log 삭제방법

삭제하는 방법은 기간을 지정하거나, 로그번호를 지정해서 삭제하는 방법 등 여러가지가 있다.

  • 현재 로그 이전의 로그들 삭제하기
PURGE BINARY LOGS BEFORE NOW();
  • 구체적인 일자를 지정하여 삭제하기
PURGE BINARY LOGS BEFORE '2020-03-09 00:00:00';
  • 로그번호를 지정해서 삭제하기
# binlog.000245 까지 삭제됨
PURGE BINARY LOGS TO 'binlog.000246';

 

마치며

binary log 파일은 생각보다 용량이 꽤 된다. 나같은 경우는 1G가량이 되는데, 서비스를 정신없이 운영하다가 DB에서 에러가 나거나 과도하게 트랜잭션이 많이 발생하는 경우에는 20~30개 이상 순식간에 쌓여버리는 경우도 있다. 이 때, binary log가 과도하게 쌓여서 DB에 충분한 용량이 없을 경우에는 위와 같은 방식으로 주기적으로 삭제해주거나, binary log 의 수명을 짧게 가져가주는게 좋다.

 

binary log 최근 것만 남기도 삭제하고 나니 한결 마음이 가벼워졌다. /var/lib/mysql 에서 확인가능하다.

 

끝.