MySQL 서버에서 서버의 상태를 진단할 수 있는 많은 도구들이 지원되지만 아쉽게도 이러한 기능들은 많은 지식을 필요로 하는 경우가 많습니다.
하지만 로그 파일을 이용하면 MySQL 서버의 깊은 내부 지식이 없어도 MySQL의 상태나 부하를 일으키는 원인을 쉽게 찾아서 해결할 수 있습니다.
1. 에러 로그 파일
MySQL이 실행되는 도중에 발생하는 에러나 경고 메시지가 출력되는 로그 파일입니다. 에러 로그 파일의 위치는 MySQL 설정 파일(my.cnf 또는 my.ini)에서 log_error
라는 이름의 파라미터로 정의된 경로에 생성됩니다. 별도로 정의되지 않은 경우에는 데이터 디렉토리에 .err
라는 확장자가 붙은 파일로 생성됩니다. 에러 로그 파일에서는 다음과 같은 메시지들을 가장 자주 보게 됩니다.
MySQL이 시작하는 과정과 관련된 정보성 및 에러 메시지
마지막으로 종료할 때 비정상적으로 종료된 경우 나타나는 InnoDB의 트랜잭션 복구 메시지
쿼리 처리 도중에 발생하는 문제에 대한 에러 메시지
비정상적으로 종료된 커넥션 메시지
InnoDB의 모니터링 또는 상태 조회 명령의 결과 메시지
MySQL의 종료 메시지
2. 제너럴 쿼리 로그 파일(제너럴 로그 파일, General log)
mysqld가 수행하는 작업에 대한 일반적인 로그 파일입니다. 즉, MySQL 서버에서 시간 단위로 실행됐던 쿼리의 내용이 모두 기록됩니다. 슬로우 쿼리 로그와는 다르게 제너럴 쿼리 로그는 실행되기 전에 MySQL이 쿼리 요청을 받으면 바로 기록하기 때문에 쿼리 실행 중에 에러가 발생해도 일단 로그 파일에 기록됩니다. 쿼리 로그 파일의 경로는 general_log_file
이라는 이름의 파라미터에 설정돼 있습니다.
쿼리 로그를 파일이 아닌 테이블에 저장하도록 설정할 수 있고, 이 경우에는 테이블을 SQL로 조회하여 로그를 검토하여야 합니다.
쿼리 로그를 파일로 저장할지 테이블로 저장할지는 log_output
파라미터로 결정됩니다. 로그 파일의 경로에 관련된 상세한 내용은 메뉴얼을 참조해주세요.
3. 슬로우 쿼리 로그
슬로우 쿼리 로그는 실행하는 데 long_query_time
초 이상 걸리고 최소 min_examined_row_limit
행을 검사해야 하는 SQL문으로 구성됩니다. 슬로우 쿼리 로그는 실행에 오랜 시간이 걸리는 쿼리를 찾는 데 사용할 수 있기 때문에 최적화 후보가 될 수 있습니다.
제너럴 쿼리 로그와 마찬가지로 log_output
옵션을 통해 로그를 파일로 저장할지 테이블로 저장할지 선택할 수 있습니다.
일반적으로 제너럴 쿼리 로그 또는 슬로우 쿼리 로그 파일의 내용이 워낙 많아서 직접 쿼리를 하나씩 검토하기에는 너무 힘들 수 있습니다. 이런 경우에 Precona에서 개발한 Percona Toolkit의 pt-query-digest
스크립트를 이용하면 빈도나 처리 성능별로 정렬해서 살펴볼 수 있습니다.
🎯정리
MySQL의 상태나 부하를 일으키는 원인을 찾고 싶다면 제일 먼저 로그 파일들을 살펴봅시다.
에러 로그 파일은 MySQL 실행 중 발생하는 치명적인 에러에 대한 메시지를 저장합니다.
제너럴 쿼리 로그 파일은 MySQL 서버에서 실행되는 모든 쿼리의 내용이 기록됩니다.
슬로우 쿼리 로그 시스템 변수
long_query_time
에 설정한 시간 이상의 시간이 소요된 모든 쿼리가 기록됩니다.