2022. 3. 9. 11:52ㆍDev
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 에서 확인가능하다.
끝.
'Dev' 카테고리의 다른 글
Logseq 요새 자주쓰는 새로운 노트앱 (0) | 2023.07.27 |
---|---|
Kubernetes Ingress SSL 인증서 적용 (한국전자인증) (2) | 2021.12.20 |
MySQL 이중화 하기(HA) 1편: Keepalived 설치하기 (1) | 2021.12.20 |
CKA 시험후기 (Certified Kubernetes Administrator) (0) | 2021.10.31 |
Fast API 는 더 깔끔한 API UI도 제공합니다 ( ReDoc ) (0) | 2021.10.29 |