로그 파일을 이용하면 MySQL의 상태나 부하를 일으키는 원인을 쉽게 찾아 해결할 수 있다.
MySQL이 실행되는 도중에 발생하는 에러나 경고 메시지가 출력되는 로그 파일이다. MySQL 설정 파일(my.cnf
)에서 log_error
라는 이름의 파라미터로 정의된 경로에 생성된다.
SHOW ENGINE INNODB STATUS
같은)의 결과 메시지
general_log_file
이라는 이름의 파라미터에 설정되어 있다.서비스 운영 중에 MySQL 전체적인 튜닝을 한다고 할 때 슬로우 쿼리 로그가 많은 도움이 된다.
long_query_time
시스템 변수에 설정한 시간 이상의 시간이 소요된 쿼리가 모두 기록된다.
log_output
옵션을 통해 파일로 기록할지 테이블로 기록할지 선택 가능
TABLE
, FILE
InnoDB에선 MySQL 엔진 레벨 잠금과 스토리지 엔진 레벨 잠금이 각각 있기에 슬로우 쿼리 로그가 혼란스러울 수도 있다.
# Time: 2020-07-19T15:44:22.178484+09:00
# User@Host: root[root] @localhost [I Id: 14
# Query_time: 1.180245 Lock_time: 0.002658 Rows_sent: 1 Rows_examined: 2844047
use employees;
SET timestamp=1595141060;
select empno, max(salary) from salaries;
Time
항목은 쿼리가 종료된 시점이다.
Time
값에서 Query_time
만큼 빼야 한다.User@Host
는 쿼리를 실행한 사용자의 계정이다.Query_time
은 쿼리가 실행되는 전체 시간을 의미한다.Lock_time
은 MySQL 엔진 레벨에서 관장하는 테이블 잠금에 대한 대기 시간이다.
Rows_examined
는 쿼리가 처리되기 위해 몇 건의 레코드에 접근했느지를 의미한다.Rows_sent
는 처리 결과로서 몇 건의 레코드가 클라이언트로 보내졌는지를 의미한다.
Rows_examined
가 높지만 Rows_sent
는 상당히 낮다면 더 적은 레코드만 접근하도록 튜닝해볼 수도 있을 것이다. (GROUP BY
나 집계 함수가 아닌 쿼리인 경우에만 해당)가끔 InnoDB 테이블에 대한 SELECT 쿼리에서
Lock_time
이 1초 이상 소요될 수 있는데 이는 MySQL 엔진 레벨에서 설정한 테이블 잠금 때문일 가능성이 높다. 그래서Lock_time
값은 튜닝이나 쿼리 분석에 별로 도움 되지 않는다.
일반적으로 슬로우 쿼리나 제너럴 로그 파일 내용은 하나씩 검토하기에 너무 복잡하다. Percona Tookit의 pt-querydigest 스크립트를 이용하면 쉽게 빈도나 처리 성능별로 쿼리를 정렬해서 살펴볼 수 있다.
## General Log 파일 분석
linux> pt-query-digest --type-'genlog' general.log > parsed_general.log
## SLOw Log 파일 분석
linux> pt-query-digest--type='slowlog' mysal-slow.1og > parsed_mysal-slog.log
파일 분석이 완료되면 3개의 그룹으로 나뉘어 저장된다.