오늘은 Mysql Log 설정에 대해서 글을 쓰려고 합니다.
Mysql의 로그 종류에는 아래와 같습니다.
- ErrorLog
- GeneralLog
- BinaryLog
- SlowQueryLog
오늘은 위의 로그에 대해 알아보고, 설정 방법 그리고 logRotate에 대해서 알아보려고 합니다.
읽기 전 체크사항
- 일단 Mysql의 로그는 File과 DB로 각각 기록할 수 있으며, File 설정이 Default임을 기억하셨으면 합니다.
- 해당 글에서 Log 설정 방법은 my.cnf를 변경하는 방법만 적어놓았습니다. my.cnf를 변경하게 되면 mysql을 다시 재시작하여야 합니다.
- 하지만 Mysql에 직접 접속하여, 설정을 한다면 재시작할 필요는 없으나, Mysql이 재시작되면 해당 설정을 다시 해줘야 하기 때문에 my.cnf로 확실하게 설정을 하셔야 합니다.
- 로그를 남길 디렉터리 및 로그 파일 소유자는 mysql로 되어야 합니다.
Error Log
Mysql DB Error에 메시지를 기록하는 로그이다.
- DB과 시작하는 과정
- 비 정상적인 종료 시 발생하는 트랜잭션 메시지
- 쿼리 도중에 발생하는 모든 에러
- InnoDB의 상태 조회 명령의 결과 메시지 기록
Error Log 설정 방법
/etc/my.cnf 파일에서 설정이 가능
기본 값으로 /var/log/mysqld.log 로 저장
/etc/my.cnf "log-error=/경로파일명.log"로 설정 가능
mysql data 디렉터리에 .err 설정 가능
General Log
- Mysql에서 실행되는 모든 쿼리가 기록
- 쿼리 도중에 발생하는 에러들도 기록
General Log 설정 방법
/etc/my.cnf에서 설정 가능
general_log = 1이면 ON, 0이면 OFF
general_log_file = /경로 및 파일 명.log
SlowQuery Log
- Long_query_time으로 설정한 시간 이상 소요 한하여 정상적이게 완료된 쿼리를 모두 기록
- 에러 로그에 대해서는 남기지 않는다.
SlowQuery Log 설정 방법
/etc/my.cnf 에서 설정 가능
slow-query-log = 1
slow-query-log-file = 경로 및 파일 명.log
long_query_time = 5 // 시간 설정
Binary Log/Relay Log
- DML 쿼리만 기록되는 로그
- DML 중에서도 Insert, Update, Delete를 저장
- Binary Log와 Relay Log에 기록되는 내용은 동일, 마스터 서버에 Binary Log, 슬레이브 서버에는 Relay Log 기록
Binary Log/Relay Log 설정 방법
/etc/my.cnf에서 설정 가능
log-bin= 로그 위치 경로.log
binlog_cache_size= 로그 캐시 사이즈
max_binlog_size= 로그 최대 사이즈
expire_logs_days= 보관 기관
Log Rotate
Mysql log을 사용하다 보면, Log File이 무한정 커질 수 있습니다. 그래서 Log File을 정리하는 LogRotate에 대해 설정을 하여야 합니다.
/etc/logrotate.d 폴더의 mysql 파일에 세팅값을 설정
/var/log/mysql/*.log {
su root root : logrotate를 실행 할 때 권한 부분에 문제가 생기는 경우 해당 옵션을 집어 넣는다.
create 640 mysql mysql : 새로 만들어지는 log 파일의 권한과 소유자
notifempty : log file이 empty일 때 새로 생성, 순환하지 않고 유지
daily : 매일 실행
rotate 5 : 순환되는 파일 개수, 5로 지정되어있으니 log를 5개까지 저장시키고 나머지 파일들은 삭제.
missingok : 로그파일이 없어도 에러처리하지 않는다.
compress : 압축 실행
dateext : 로그 파일을 년월일로 표시
postrotate : logrotate 작업 이후에 지정된 작업
#파일을 변경해주는 작업
if test -x /usr/local/mysql/bin/mysqladmin && \
/usr/local/mysql/bin/mysqladmin --socket=/box/mysql/mysql.sock ping &>/dev/null
then
#/usr local/mysql/bin/mysqladmin -- socket=/box/mysql/mysql.sock flush-logs
/usr/local/mysql/bin/mysql -e 'flush logs;'
fi
endscript
}
#정상 실행 체크, 강제로 rotate 시킬 때 -f 옵션을 추가하여 실행
logrotate -v /etc/logrotate.d/mysql-log-rotate
이상입니다. 읽어주셔서 감사합니다.
참고 사이트
- MysqlLog
toshi15shkim.github.io/articles/2019-06/db-mysql-log
- logRotate