[MySQL] Logrotate - 로그 분할
- Databases/MySQL
- 2023. 7. 2.
■ 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
도움이 되셨다면 광고클릭 한번 부탁드립니다.
'Databases > MySQL' 카테고리의 다른 글
[MySQL] mysqlsh의 util.exportTable, util.importTable를 이용하여 덤프 및 임포트하기 (0) | 2024.02.19 |
---|---|
[MySQL] PERSIST, RESET PERSIST를 통한 서버 파라미터 관리 (0) | 2024.01.01 |
[MySQL] 서버 자동 환경 설정(MySQL 8.0) (0) | 2023.03.19 |
[MySQL] 리눅스의 파일 열기 갯수 변경 및 자원 제한 확인 (0) | 2023.03.19 |
[MySQL][Parameter] back_log (2) | 2023.02.24 |