본문 바로가기
공부/RDBMS

[DB] General Query Log과 Slow Query Log

by persi0815 2024. 12. 14.

General Query Log

Mysql 서버에서 어떤 쿼리가 실행중인지 검토해보고 싶을 때가 있는데, 이때는 쿼리 로그를 활성화해서 쿼리를 쿼리 로그 파일로 기록하게 한 다음, 해당 파일을 검토하면 된다. 

쿼리 로그 파일에는 시간 단위로 실행됐던 쿼리의 모든 내용이 기록되는데, Slow Query와 다르게 General log는 실행되기 전 MySQL이 쿼리 요청을 받으면 바로 기록하기에 쿼리 실행 중에 에러가 발생해도 일단 로그 파일에 기록된다는 특징이 있다. 

 

쿼리 로그 파일의 경로는 general_log_file이라는 이름의 파라미터에 설정되어 있다. 

> SHOW GLOBAL VARIABLES LIKE 'general_log_file;'

 

쿼리 로그를 파일이 아닌 테이블에 저장하도록 설정할 수 있는데, 해당 경우에는 파일이 아닌 테이블을 sql로 조회해서 검통해야 한다. 쿼리 로그를 파일로 저장할지 테이블로 저장할지는 log_output 파라미터로 결정할 수 있다. 여기서 FILE 혹은 TABLE로 설정하면 되는데, 이 설정이 아래의 Slow Query Log에도 영향을 준다. 

 

 

Slow Query Log

서비스 운영 중에 MySQL 서버의 전체적인 성능 저하를 검사할 때에 슬로우 쿼리 로그가 자주 사용된다. 슬로우 쿼리 로그 파일에는 log_query_time 시스템 변수에 설정한 시간(초단위. 소수점으로 ms도 설정 가능) 이상의 시간이 소요된 쿼리가 모두 기록된다. 슬로우 쿼리 로그는 MySQL이 쿼리를 실행한 후, 실제 소요된 시간을 기준으로 슬로우 쿼리 로그에 기록할지 여부를 판단하기에 반드시 쿼리가 정상적으로 실행이 완료되어야지만 슬로워 쿼리 로그에 기록될 수 있다. 즉, 정상적으로 실행이 완료됐고, 실행하는 데 걸린 시간이 long_query_time에 정의된 시간보다 많이 걸린 쿼리가 기록된다. 

 

슬로우 쿼리 로그 파일에는 쿼리가 종료된 시점(Time), 쿼리 수행한 사용자의 계정(User@Host), 쿼리가 실행되는 데 걸린 전체 시간(Query_time), 테이블 잠근에 대한 대기 시간(Lock_time), 쿼리가 처리되기 위해 접근한 레코드 개수(Rows_examined), 클라이언트에게 보낸 처리 결과 개수(Rows_sent)을 표시한다. 

 

이 두가지 Log File을 검토하려고 하면, 내용이 상당히 많아서 시간이 너무 많이 걸리기도 한다. 그래서 어느 쿼리를 튜닝해야 할지 식별하기가 어려울 수 있는데, 이때는 Percona에서 개발한 Percona Toolkit의 pt-query-digest 스크립트를 이용하면 쉽게 빈도나 처리 성능별로 쿼리를 정렬해서 살펴볼 수 있다. 해당 툴을 통해 슬로우 쿼리 로그의 실행 시간, 잠금 대기 시간 등에 대해 평균 및 최소/최대 값을 알 수 있다. 또한, 각 쿼리 별 응답 시간과 실행 횟수를 알 수 있고, --order-by 옵션으로 정렬 순서를 변경할 수도 있다. 상세 정보에 대해 보기 위해서는 개별 쿼리의 정보를 확인하면 되는데, 여기서 쿼리의 히스토그램 같은 상세 내용을 확인 가능하다.