탕구리's 블로그

MYSQL의 log에 대해 빠르고 간단하게 알아보자! 본문

Conception/Database

MYSQL의 log에 대해 빠르고 간단하게 알아보자!

탕구리당 2024. 3. 12. 00:42
반응형

mysql log의 종류는 크게 총 4개로 구성된다.

  1. error log → mysqld를 시작, 구동 또는 종료할 때 발생하는 에러 로그
  2. general log → established된 클라이언트 접속 및 클라이언트로부터 받는 명령문
  3. binary log → 데이터를 변명시키는 모든 명령문(replica 포함)
  4. slow log → long_query_time 시간보다 오래 실행되는 쿼리 + 인덱스 미사용 쿼리

mysql log는 별도의 경로를 지정하지 않으면 디폴트 경로(/var/log/mysql/error.log)에 저장된다.

경로 설정을 위해선 /etc/mysql/my.cnf의 “log_error=경로.log” 형태로 설정이 가능하다.

 

1. error_log

  • mysqld의 시작 , 종료 시점을 가리키는 정보를 기록한다.
  • mysqld가 자동으로 검사 또는 리페어해야 할 필요가 있는 테이블을 발견하게 되는 경우 에러로그에 기록한다.
  • --log-error[=file_name] 옵션을 통해 경로 및 파일명을 설정할 수 있다.

 

2. general_log

  • 일반 쿼리 로그는 mysqld의 일반적인 실행 결과를 기록한다.
  • 클라이언트가 접속을 하거나 또는 접속을 끊을 때 정보를 기록한다.
  • 일반 쿼리 로그는 클라이언트에서 에러를 의심할 경우 및 클라이언트가 mysqld에 보내는 것을 확인하기 위해 사용한다.
  • general_log의 경우 기본 설정 상태는 OFF 상태 이므로 로그를 남기기 위해선 ON으로 변경해주어야 한다.
 SET GLOBAL general_log = 'ON';
 SET GLOBAL general_log_file='/var/lib/mysql/general.log';

 

3. binary_log(binlog)

  • 데이터의 변경이 일어나는 모든 명령문에 대한 기록이 되어있다.
  • 명령문은 데이터 수정을 가리키는 이벤트(event) 형태로 저장된다.
  • 명령문에 대한 업데이트 시간 정보도 포함된다.
  • 트랜젝션을 사용하는 경우 바이너리 로그를 통해 백업을 진행해야 한다.
  • 바이너리 로그를 활성화하는 경우 서버의 성능저하를 일으킬 수 있으므로 사용에 유의해야 한다.
# 특정 db의 bin_log 생성을 설정할 수 있다. 
--binlog-do-db=db_name

# 특정 db의 bin_log 생성을 무시할 수 있다.
--binlog-ignore-db=db_name

 

3-1. binary_log 종류

  • Statement-based logging
    • Insert, Update, Delete에 대한 SQL 문들이 포함된다.
    • 로그 파일에 적은 데이터가 기록되며, 로그 파일에 필요한 저장 공간이 줄어드는 장점이 있다.
    • 백업에 대한 복구는 Replay처럼 수행되며 빠르게 복원이 수행될 수 있다.
  • Row-based logging
    • 각 행에 대한 변화를 기록한다.
    • 각 행의 변경 사항을 이진 로그에 기록하므로 로그 파일의 크기가 매우 빠르게 증가할 수 있으며 지연이 발생할 수도 있다.
  • Statement-based + Statement-based 혼합형

 

4. slow-query-log

  • 슬로우 쿼리 로그는 실행 시간이 long_query_time 보다 길게 걸리는 모든 SQL 명령문으로 구성된다.
  • long_query_time의 최솟값 및 디폴트 값은 각각 1과 10이다.
  • 활성화를 위해서는 mysqld를 --log-slow-queries[=file_name] 옵션 설정이 필요하다
# 로그 파일 경로 및 on/off 여부 확인
SHOW VARIABLES LIKE '%slow_query%';

# long_query_time 설정 및 설정 시간 확인
SHOW VARIABLES LIKE '%long_query%';
set global long_query_time=5;

# slow-query-log에서 확인 가능한 항목들
Time : 쿼리가 종료된 시점 (Time에서 Query_time 만큼 빼면 시작된 시점)
User@Host : 실행한 사용자 계정
Query_time : 쿼리가 실행되는데 걸린 전체 시간
Rows_examined : 이 쿼리가 처리되기 위해 접근한 레코드 수
Rows_sent : 실제 보낸 쿼리

 

 

참고 : https://dataonair.or.kr/db-tech-reference/d-guide/dbms-2/?mod=document&uid=62464

반응형
Comments