[MySQL] Logrotate - 로그 분할

MySQL 로그 관리 필요성

MySQL 로그는 기본적으로 하나의 파일이 생성되면 계속 처음에 생성된 파일에 쌓이는 구조입니다.

만약 사용량이 많은 MySQL에서 로그 파일에 대해 그냥 두게 된다면 파일 하나에 몇기가로 쌓일 수도 있습니다.

이는 추후 문제 문석을 해야 할때 파일의 크기가 워낙 크기 때문에 문제가 수도 있습니다.

그래서 주기적으로 파일을 절단하여 크기를 관리해 주어야 합니다.

 

로그 파일 관리 - Logrotate

리눅스 시스템엔 본적으로 로그관리를 해주는 기능이 기본적으로 탑재되어 있습니다. Logrotate라고 불리는   기능은 로그관리가 필요한 파일에 대하여 매일, 매주, 월간등등 주기를 정하여 그때마다 파일을 분할(logrrotate)하여 파일을 0바이트 크기부터 시작할 있도록 합니다. 이렇게 만들어진 로그 파일을들은 Elastic stack(Logstats, Elastic search, kibana) 이용해서 로그 분석 시스템을 구축할 수도 있습니다.

 

■ Logrotate 이론

실행순서

Logroate /etc/cron.daily/logrotate 스크립트에서 의해 구동되고, 주기는 매일 오전 4(4am) 기본값입니다.

따라서, 시간대나 주기를 변경하고 싶다면 cron job 별도로 설정을 하여 구동하면 됩니다.

 

구성 구조

Logrotate 다음과 같은 구조로 되어 있습니다.

설명 위치 추가 내용
데몬 실행 프로그램 위치 /usr/sbin/logrotate 데몬 프로그램 위치
데몬 설정파일 /etc/logrotate.conf Logrotate 사용하기 위한 설정파일들이 위치한
프로세스 설정파일 /etc/logrotate.d/ logrotate 설정 파일
작업내역 로그 /var/log/syslog
/var/log/cron
실행 로그 파일 위치. Ubuntu syslog 합쳐져 있고 CentOS Rocky 같은 Redhat 계열은 cron 로그가 따로 남습니다.

 

 

테스트나 검증을 위한 Logrotate 수동 수행

수동수행

/usr/sbin/logrotate -f /etc/logrotate.d/mysql_errlog

 

수동 수행 디버그 모드

/usr/sbin/logrotate -d /etc/logrotate.d/mysql_slowlog

 

실행과정을 화면에 표시하기

/usr/sbin/logrotate -v /etc/logrotate.d/mysql_errlog

 

물론 위의 옵션을 한번에 해서 사용할 수도 있습니다.

/usr/sbin/logrotate -f -d -v /etc/logrotate.d/mysql_errlog

 

 

■ Logrotate 설정

Logrotate 샘플파일을 이용해서 작성합니다. 샘플파일은 MySQL 엔진 디렉토리에 있습니다.

MySQL디렉토리/support-files/mysql-log-rotate

mysql-log-rotate파일을 이용하여 다음과 같이 만듭니다.

 

작성 방법

shell> cd /etc/logrotate.d
shell> vi mysql_err
/mysql/mysql_log/mysql.err {
    # su root root
    create 600 mysql mysql
    notifempty
    daily
    rotate 5
    missingok
    compress
  postrotate
    # just if mysqld is really running
    if test -x /usr/local/mysql/bin/mysqladmin && \
      /usr/local/mysql/bin/mysqladmin ping &>/dev/null
    then
      /usr/local/mysql/bin/mysqladmin flush-logs
    fi
  endscript
}

 

/usr/local/mysql/data/mysqld.log : 로그 파일 경로. 실제 경로와 로그 파일을 입력합니다.

su root root : logrotate 실행 만약 권한 부분에 문제가 발생한다면 해당 옵션을 넣어 테스트해 봅니다.

create 640 mysql mysql : 신규 파일이 생성될때 기본적으로 부여되는 파일의 권한과 소유자 입니다.

notifempty : log file 0바이트 일때는 새로 신규파일을 만들지 않고 있던 파일 그대로 유지시킵니다. 아래 옵션(ifempty) 비교해서 둘중에 하나만 사용합니다. 값을 추천드립니다.

ifempty : log file 0바이트일 때도 신규 파일을 생성합니다. 위의 옵션(notifempty) 비교해서 둘중에 하나만 사용합니다.

daily : 실행 주기 입니다. hourly : 매시간 실행, dailiy : 매일실행, weekly : 매주 실행, monthly : 매달 실행

rotate 30 : 순환되는 파일에 대해 보관할 갯수 입니다. 만약 30으로 되어 있으면 순환파일에 대해 최신 30개만 가지고 있고 나머지는 삭제합니다.

missingok : 로그파일이 없어도 에러처리하지 않습니다.

compress : 해당 로그파일에 대해 압축을 실행합니다.

dateext : 로그가 순환될때 옵션을 지정해주지 않으면 파일이 log.1, log.2 이런식으로 숫자로 표현됩니다. 옵션을 사용하면 로그 파일이 순환될때 뒤에 확장자로 날짜(년월일) 붙여줍니다.

postrotate/endscript : logrotate 작업 후에 지정된 작업(스크립트) 실행합니다.

 

• MySQL 명령 작업 인증

logrotate 수행하기 위해선 MySQL 접속 암호가 필요한데 3가지 방법이 있습니다.

1. my.cnf 활용

[mysqladmin] 섹션을 만들고 그곳에 아이디와 암호를 입력합니다.

[mysqladmin]

password = ******

user= root

 

2. logrotate 넣기

mysqladmin 뒤에 -u, -p 옵션을 붙여 암호를 입력해 둡니다.

 

3. --login-path 이용

--login-path 이용하여 로그인 암호를 만들어 둡니다.

shell> mysql_config_editor set --login-path=client --host=localhost --user=root --port=3306 --password

 

테스트

수동으로 테스트를 해봅니다.

shell> /usr/sbin/logrotate -f /etc/logrotate.d/mysql_errlog

 

수행을 하면 로그 디렉토리에 해당 파일이 logroate된것을 확인해볼 있습니다.

shell> cd /mysql/mysql_log
shell> ls -al
mysql.err
mysql.err-20230326
mysql.err-20230629
mysql.err-20230630

 

도움이 되셨다면 광고클릭 한번 부탁드립니다.

Designed by JB FACTORY