개발자의 길

[MYSQL] general_log 및 logrorate 관리 본문

3. DB

[MYSQL] general_log 및 logrorate 관리

자르르 2020. 10. 19. 18:43


디비를 관리하다 보면, 전체 쿼리 로그를 확인 해야 할 경우가 많다.(많은가..?)

 

전체 쿼리를 관리 하기 위한 general_log와 

 

모든 쿼리를 관리하다 보면 서버 용량이 금방 full 차기 때문에, 로그 관리를 위한 logrorate를 알아보겠다.

 

1. general_log

 

우선 general_log가 활성화 되어있는지 확인

 

-> SHOW VARIABLES LIKE '%general_log%';

결과는 2줄이 나온다

general_log : OFF

general_log_file  : 파일 경로

 

general_log는 기본적으로 파일로 떨궈 지겠끔 되어있다.

-> SHOW VARIABLES LIKE '%log_output%';

해당 결과로 FILE로 떨굴지 TABLE로 쌓을지 정할수 있다. 

set global log_output='TABLE';

set global log_output='FILE'; -- default 값

 

테이블에 쌓게 되면, 기본적으로 mysql.general_log 테이블에 쌓이게 된다.

 

하지만 table 방식은 비추천 한다. 왜냐하면, 끝없이 쌓이는 테이블인데다가

index도 따로 안걸려있어서 삭제도 힘들다.

심지어 EVENT랑 PROCEDURE를 이용해서 주기적으로 삭제 하려고 해도 안된다. 

처음에는 이렇게 시도 하다가, 삭제 하려고 보니 db lock이 걸려있어서,

general_log 끄기 -> general_log 테이블을 일정량 삭제 -> 다시 general_log 켜기

로 해야 삭제가 가능했다. 심지어 많이 쌓이면 index가 안걸려있으니 엄청 느리다..ㅂㄷㅂㄷ

 

그래서 다른 방법으로 file로 쌓고, 해당 file을 logrotate로 관리 하는 방식으로 하는게 가장 베스트 인것 같다.

 

우선

set global general_log='ON'

set global general_log_file = '/home/test/db/general.log' (경로 임의 지정함)

해도 되지만, 꾸준히 쓸 예정이니, 이렇게 안하고

db 가 설치된 폴더에 my.cnf 파일을 수정하자

my.cnf 열어서

general_log=ON

general_log_file=/home/test/db/general.log

 

%) global log_output 은 디폴트가 FILE 이라서 따로 셋팅 안했다.

 

셋팅 후 db 재시작하고 아까 SHOW VARIABLES LIKE '%general_log%'; 요 명령어로 다시 확인하자.

 

잘 되어 있다는 전제 하에,

 

아무 쿼리나 돌려봐서, /home/test/db/general.log 여기에 잘 쌓이나 확인 해보자.

 

잘 쌓일 거다..만약 안쌓이면, 그건 따로 다시 찾아봐서 하길 바란다.

 

2. logrotate

 

logrotate는 기본적으로 리눅스 상에 쌓이면 많은 로그들을 파일분할해서 관리하기 위해 사용한다.

우선 본글은 centos 8에서 테스트를 진행하였고, 기본적으로 logrorate는 설치되어있다.(logrotate-3.14.0-3.el8.x86_64)

 

기본적으로 logrotate는 /etc/logrotate.conf 파일에 설정파일이 있다.

 

해당 파일을 열어보면, /etc/logrotate.d 폴더를 include 하고 있어서

 

/etc/logrotate.d 폴더만에 해당 파일을 만들면 자동으로 실행된다.

 

(/etc/cron.daily 폴더 안에 logrotate 실행 파일이 들어가 있어서, 자동으로 logrotate.conf 를 logrotate로 실행하게 된다.)

 

logrotate 의 실행 순서를 보자면

 

crontab -> cron.daily -> logrotate -> logrotate.conf -> logrotate.d

 

순서로 간다

 

대충 logrorate 파일을 만드는 옵션을 보자.

daily : 일단위로 실행합니다

rotate 5 : 회전 주기를 설정합니다

notifempty : 로그파일의 내용이 없을경우 rotate 하지 않습니다

 

missingok : 로그파일이 없을경우 에러메시지를 출력하고 다음으로 실행합니다

 

compress : 로그파일을 압축합니다

 

sharedscripts : 여러개의 로그파일을 스크립트로 공유하여 실행합니다

 

postrotate : 실행 후 스크립트 파일 실행합니다

 

/server/apache2/bin/apachectl graceful

 

endscript : 실행 후 스크립트 파일 실행합니다

강제 실행 명령어

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

 

실행 과정 화면 표시

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

 

대충 기본 설명은 여기까지 하고, 실제로 내가 생성한 파일을 예시를 들어보겠다.

mysql 을 설치하게 되면

 

support-files 폴더 안에

 

mysql-log-rotate 파일이 있다. 이 파일은 rotate 파일을 만들라고 예시로 둔 파일이다.

 

이 파일을 복사해서 만들어 보자.

 

-> cp mysql-log-rotate mysql-log-rotate-test

-> vi mysql-log-rotate-test

 

/home/test/db/mysql-log-rotate-test {

        create 600 irteam irteam 
     #   notifempty 
        daily 
        rotate 30 
        missingok 
        compress 
        dateext 
    postrotate

      # just if mysqld is really running

      if test -x /home/test/db/mysql/bin/mysqladmin && \

 

             /home/test/db/mysql/bin/mysqladmin -uadmin -p'암호' ping & > /dev/null

      then

             /home/test/db/mysql/bin/mysqladmin -uadmin -p'암호' flush-logs

      fi

    endscript

}

1) 나는 파일을 irteam:irteam 소유주로 600권한으로 만들고

2) 매일 실행하며

3) 파일을 30개까지 유지

4) 로그파일이 없을경우 에러메시지를 출력하고 다음으로 실행

5) compress 압축

6) dateext : 날짜형식으로 분할

7) postrotate는 실행이 끝나고 할 명령인데

 이 부분이 중요하다.

 파일을 mysql에서 계속 붙잡고 있기 때문에

 flush 로 꼭 한번 리셋 해줘야 제대로 된다.

 

이렇게 만들고 나서

나는 /etc/logrorate.d 폴더 안에 넣어도 되지만,

 

따로 crontab 에 등록을 해두었다.

# 매일 2시에 실행

0 2 * * * /usr/sbin/logrotate -s /home/test/db/logrotate.status -f /home/test/db/mysql-log-rotate-test

 

중간에 -s 해서 status 를 저장하는 이유는 잘 실행 되었는지 결과를 볼수 있게끔 하려고 넣었다. 없어도 된다.

 

왜 /etc/logrotate.d 폴더에 안넣고 따로 crontab을 등록했냐고 하면,

 

logrotate.d 폴어는 cron.daily 를 통해서 실행이 되는데, 이게 매일 동일한 일정한 시간에 실행 되지 않는다.

 

centos에서 크론탭의 부하 및 단점을 보완 하려고 anacron 이라는것을 도입하였는데, 이 녀석이 랜덤으로 04시 부터인가? 간격을 둬서 매일 실행 하는 시간이 일정치가 않다. 이부분은 anacron 을 검색해서 봐라.

 

나는 매일 동일한 시간에 실행을 하려고 그냥 따로 폴더 안에 crontab 실행을 등록하였다.

 



이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
공유하기 링크
Comments