Loading...
MySQL 9.5 Reference Manual 9.5의 7.4.5 The Slow Query Log의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
slow query log는 실행에 long_query_time초보다 더 오래 걸리고, 검사된 행 수가 최소 min_examined_row_limit 이상인 SQL 구문들로 구성됩니다.
slow query log는 실행에 오랜 시간이 걸리는 쿼리를 찾아내어 최적화 대상으로 삼는 데 사용할 수 있습니다.
하지만 길이가 긴 slow query log를 살펴보는 일은 시간이 많이 걸릴 수 있습니다. 이를 더 쉽게 하기 위해, slow query log 파일을 처리하고 그 내용을 요약하기 위해 mysqldumpslow 명령을 사용할 수 있습니다. Section 6.6.10, “mysqldumpslow — Summarize Slow Query Log Files”를 참조하십시오.
초기 잠금을 획득하는 데 걸리는 시간은 실행 시간에 포함되지 않습니다. mysqld는 구문이 실행을 마치고 모든 잠금이 해제된 후에야 그 구문을 slow query log에 기록하므로, 로그의 순서는 실행 순서와 다를 수 있습니다.
long_query_time의 최소값과 기본값은 각각 0과 10입니다.
이 값은 마이크로초 단위의 해상도로 지정할 수 있습니다.
기본적으로, 관리 구문은 로그에 기록되지 않으며, 조회에 인덱스를 사용하지 않는 쿼리도 로그에 기록되지 않습니다.
이 동작은 log_slow_admin_statements와 log_queries_not_using_indexes를 사용하여 변경할 수 있으며, 이에 대해서는 뒤에서 설명합니다.
기본적으로 slow query log는 비활성화되어 있습니다.
초기 slow query log 상태를 명시적으로 지정하려면 --slow_query_log[={0|1}]를 사용하십시오.
인수를 생략하거나 인수로 1을 사용하면 --slow_query_log는 로그를 활성화합니다.
인수로 0을 사용하면 이 옵션은 로그를 비활성화합니다.
로그 파일 이름을 지정하려면 --slow_query_log_file=file_name을 사용하십시오.
로그 대상지를 지정하려면 log_output 시스템 변수를 사용하십시오 (자세한 내용은 Section 7.4.1, “Selecting General Query Log and Slow Query Log Output Destinations”을 참조).
참고
TABLE 로그 대상지를 지정하는 경우, Log Tables and “Too many open files” Errors를 참조하십시오.
slow query log 파일의 이름을 지정하지 않으면 기본 이름은 host_name-slow.log입니다.
서버는 절대 경로 이름을 사용하여 다른 디렉터리를 지정하지 않는 한 데이터 디렉터리에 이 파일을 생성합니다.
런타임 중에 slow query log를 비활성화하거나 활성화하거나 로그 파일 이름을 변경하려면 전역 slow_query_log 및 slow_query_log_file 시스템 변수를 사용하십시오.
slow_query_log를 0으로 설정하면 로그가 비활성화되고, 1로 설정하면 활성화됩니다.
slow_query_log_file를 설정하여 로그 파일의 이름을 지정하십시오.
이미 로그 파일이 열려 있는 경우, 그 파일은 닫히고 새 파일이 열립니다.
--log-short-format 옵션을 사용하면 서버는 slow query log에 더 적은 정보를 기록합니다.
느린 관리 구문을 slow query log에 포함하려면 log_slow_admin_statements 시스템 변수를 활성화하십시오.
관리 구문에는 ALTER TABLE, ANALYZE TABLE, CHECK TABLE, CREATE INDEX, DROP INDEX, OPTIMIZE TABLE, REPAIR TABLE가 포함됩니다.
행 조회에 인덱스를 사용하지 않는 쿼리를 slow query log에 기록되는 구문에 포함하려면 log_queries_not_using_indexes 시스템 변수를 활성화하십시오.
(이 변수가 활성화된 경우에도, 테이블의 행이 두 개 미만이어서 인덱스가 존재하더라도 이점이 없는 쿼리는 서버가 로그에 기록하지 않습니다.)
인덱스를 사용하지 않는 쿼리를 로그에 기록하는 경우, slow query log는 빠르게 커질 수 있습니다.
이러한 쿼리에 대해 속도 제한을 설정하는 것은 log_throttle_queries_not_using_indexes 시스템 변수를 설정하여 가능합니다.
기본적으로 이 변수는 0이며, 이는 제한이 없음을 의미합니다.
양수 값은 인덱스를 사용하지 않는 쿼리 로깅에 대해 분당 제한을 부과합니다. 이러한 첫 번째 쿼리가 서버가 지정된 제한에 도달할 때까지 쿼리를 로그에 기록하는 60초 창을 열며, 이후의 추가 쿼리는 억제됩니다. 창이 끝날 때 억제된 쿼리가 있었다면, 서버는 그 개수와 그 쿼리들에 사용된 총 시간을 나타내는 요약 정보를 로그에 기록합니다. 다음 60초 창은 인덱스를 사용하지 않는 다음 쿼리가 서버에 의해 로그에 기록될 때 시작됩니다.
서버는 다음과 같은 순서로 제어 매개변수를 사용하여 어떤 쿼리를 slow query log에 기록할지 결정합니다:
쿼리는 관리 구문이 아니어야 하거나, log_slow_admin_statements가 활성화되어 있어야 합니다.
쿼리는 최소한 long_query_time초 이상 걸렸어야 하거나, log_queries_not_using_indexes가 활성화되어 있고, 행 조회에 인덱스를 사용하지 않았어야 합니다.
쿼리는 최소한 min_examined_row_limit개의 행을 검사했어야 합니다.
쿼리는 log_throttle_queries_not_using_indexes 설정에 따라 억제되지 않아야 합니다.
log_timestamps 시스템 변수는 slow query log 파일에 기록되는 메시지의 타임스탬프 시간대를 제어합니다 (general query log 파일과 에러 로그에 대해서도 마찬가지입니다).
이 변수는 로그 테이블에 기록되는 general query log 및 slow query log 메시지의 시간대에는 영향을 주지 않지만, 해당 테이블에서 조회된 행은 CONVERT_TZ()를 사용하거나 세션 time_zone 시스템 변수를 설정하여 로컬 시스템 시간대에서 원하는 다른 시간대로 변환할 수 있습니다.
기본적으로 레플리카는 복제된 쿼리를 slow query log에 기록하지 않습니다.
이를 변경하려면 log_slow_replica_statements 시스템 변수를 활성화하십시오.
row 기반 복제가 사용되는 경우 (binlog_format=ROW), 이러한 시스템 변수는 아무런 효과가 없음을 유의하십시오.
쿼리는 바이너리 로그에 구문 포맷으로 기록될 때만 레플리카의 slow query log에 추가됩니다.
즉 binlog_format=STATEMENT가 설정된 경우이거나, binlog_format=MIXED가 설정되어 있고 해당 구문이 구문 포맷으로 로그에 기록되는 경우입니다.
binlog_format=MIXED가 설정된 상태에서 row 포맷으로 로그에 기록되는 느린 쿼리나, binlog_format=ROW가 설정된 상태에서 로그에 기록되는 쿼리는 log_slow_replica_statements가 활성화되어 있더라도 레플리카의 slow query log에 추가되지 않습니다.
slow query log가 활성화되어 있으면, 서버는 log_output 시스템 변수에 의해 지정된 모든 대상지에 출력을 기록합니다.
로그를 활성화하면, 서버는 로그 파일을 열고 그 파일에 시작 메시지를 기록합니다.
그러나 쿼리를 파일에 추가로 로그에 기록하는 동작은 FILE 로그 대상지가 선택된 경우에만 발생합니다.
대상지가 NONE이면, slow query log가 활성화되어 있더라도 서버는 어떤 쿼리도 기록하지 않습니다.
출력 대상지로 FILE이 선택되지 않은 경우, 로그 파일 이름을 설정해도 로깅에는 아무런 영향이 없습니다.
slow query log가 활성화되어 있고 출력 대상지로 FILE이 선택된 경우, 로그에 기록되는 각 구문 앞에는 # 문자로 시작하는 줄이 하나 붙으며, 이 줄에는 다음 필드가 포함됩니다 (모든 필드는 단일 줄에 존재합니다):
Query_time: duration
구문 실행 시간(초 단위).
Lock_time: duration
잠금을 획득하는 데 걸린 시간(초 단위).
Rows_sent: N
클라이언트에 전송된 행의 개수.
Rows_examined:
서버 레이어에서 검사한 행의 개수 (스토리지 엔진 내부의 처리는 포함하지 않음).
log_slow_extra 시스템 변수를 활성화하면, 서버는 방금 나열한 필드에 더해 다음의 추가 필드를 FILE 출력에 기록합니다 (TABLE 출력은 영향을 받지 않습니다).
일부 필드 설명은 상태 변수 이름을 참조합니다.
자세한 내용은 상태 변수 설명을 참고하십시오.
다만, slow query log에서는 카운터가 세션 누적 값이 아니라 구문 단위 값이라는 점에 유의하십시오.
Thread_id: ID
구문 스레드 식별자.
Errno: error_number
구문 에러 번호. 에러가 발생하지 않은 경우 0.
Killed: N
구문이 종료된 경우, 종료 이유를 나타내는 에러 번호. 구문이 정상적으로 종료된 경우 0.
Bytes_received: N
해당 구문에 대한 Bytes_received 값.
Bytes_sent: N
해당 구문에 대한 Bytes_sent 값.
Read_first: N
해당 구문에 대한 Handler_read_first 값.
Read_last: N
해당 구문에 대한 Handler_read_last 값.
Read_key: N
해당 구문에 대한 Handler_read_key 값.
Read_next: N
해당 구문에 대한 Handler_read_next 값.
Read_prev: N
해당 구문에 대한 Handler_read_prev 값.
Read_rnd: N
해당 구문에 대한 Handler_read_rnd 값.
Read_rnd_next: N
해당 구문에 대한 Handler_read_rnd_next 값.
Sort_merge_passes: N
해당 구문에 대한 Sort_merge_passes 값.
Sort_range_count: N
해당 구문에 대한 Sort_range 값.
Sort_rows: N
해당 구문에 대한 Sort_rows 값.
Sort_scan_count: N
해당 구문에 대한 Sort_scan 값.
Created_tmp_disk_tables: N
해당 구문에 대한 Created_tmp_disk_tables 값.
Created_tmp_tables: N
해당 구문에 대한 Created_tmp_tables 값.
Start: timestamp
구문 실행 시작 시간.
End: timestamp
구문 실행 종료 시간.
하나의 slow query log 파일에는 log_slow_extra를 활성화하여 추가 필드가 포함된 줄과, 그렇지 않은 줄이 혼합되어 있을 수 있습니다.
로그 파일 분석기는 필드 개수로 해당 줄에 추가 필드가 포함되어 있는지 여부를 판별할 수 있습니다.
slow query log 파일에 기록되는 각 구문 앞에는 느린 구문이 실행을 시작한 시간을 나타내는 타임스탬프를 포함하는 SET 구문이 하나씩 붙습니다.
slow query log에 기록되는 구문 내의 비밀번호는 서버에 의해 평문으로 그대로 나타나지 않도록 다시 작성됩니다. Section 8.1.2.3, “Passwords and Logging”을 참조하십시오.
(parsing error, 예를 들어 syntax error 등으로 인해) 파싱할 수 없는 구문은 slow query log에 기록되지 않습니다.
7.4.4 The Binary Log
7.4.6 Server Log Maintenance