July
26th,
2021
- MySQL은 다른 DBMS에 비교하면 DBA 혹은 개발자를 위한 진단 도구가 부족한 편이다.
- 하지만 로그 파일을 이용하면 MySQL의 상태나 부하를 일으키는 원인을 찾아 해결할 수 있다. 이 로그들을 잘 살펴보는 방법에 대해 배워보자.
3.8.1 에러 로그 파일
- MySQL이 실행되는 도중 발생하는 에러나 경고 메시지가 출력되는 로그 파일이다.
- 에러 로그 파일의 위치는 MySQL 컨피규레이션 파일에
log_error
라는 이름의 파라미터에 정의된 경로에 있는 위치해 있다.
에러 로그 파일에 담겨져있는 메시지
- MySQL이 시작하는 과정과 관련된 정보성 및 에러 메시지
- 마지막 종료시 비정상적으로 종료된 경우 나타나는 InnoDB 트랜잭션 복구 메시지
- 쿼리 처리 도중 발생하는 문제에 대한 에러 메시지
- 비정상적으로 종료된 커넥션 메시지
- InnoDB의 모니터링 명령이나 상태 조회 명령의 결과 메시지
- MySQL의 종료 메시지
3.8.2 제너럴 쿼리 로그 파일(제너럴 로그 파일, General log)
- MySQL이 서버에서 실행되는 쿼리 목록을 뽑을 때 사용한다.
- 쿼리 로그 파일에는 시간 단위로 실행됐던 쿼리 내용이 모두 기록된다.
- 슬로우 쿼리 로그와는 다르게, 제너럴 쿼리 로그는 실행 전 MySQL이 쿼리 요청을 받으면 바로 기록하기 때문에, 에러가 발생해도 일단 로그 파일에 기록한다.
3.8.3 슬로우 쿼리 로그
- 슬로우 쿼리 로그 파일에는 컨피규레이션에 정의한 시간(long_query_time 파라미터에 초 단위로 설정됨) 이상의 시간이 소요된 쿼리가 모두 기록된다.
- 쿼리가 정상적으로 실행이 완료되어야 슬로우 쿼리 로그에 기록될 수 있다.
- 슬로우 쿼리 로그 파일을 실행하면 위와 같이 수행 시간, 쿼리를 실행한 사용자의 계정, 소요 시간, 영향받는 row 개수를 보여준다.
- MyISAM 혹은 MEMORY 스토리지 엔진에서는 테이블 단위의 잠금을 사용해 MVCC와 같은 메커니즘이 없어 SELECT 쿼리라 하더라도 lock_time이 1초 이상 소요될 가능성이 있다.
- InnoDB의 SELECT 쿼리도 lock_time이 0이 아닐 수 있는데, 이 때는 InnoDB의 레코드 수준 잠금이 아니라, MySQL 엔진 레벨에서 설정한 테이블 잠금 때문일 가능성이 높다.
- 슬로우 쿼리 로그의 내용을 분석해 쿼리 단위로 평균을 산출해서 많이 실행된 쿼리 순서대로 정렬한 후, 파일로 기록하는 스크립트도 있어 슬로우 쿼리를 파악하고 개선할 수 있다.
3.8.4 바이너리 로그와 릴레이 로그
- 바이너리 로그와 릴레이 로그는 마스터/슬레이브 구조에서 동시성을 보장하기 위해서 사용한다.
- 바이너리 로그는 마스터 MySQL 서버에 생성되고, 릴레이 로그는 슬레이브 MySQL 서버에 생성된다.
- 바이너리 로그 파일은 데이터 구조나 내용을 변경하지 않는 쿼리는 기록되지 않는다.
- 바이너리 로그는 이진 파일로 되어 있어 직접적으로 확인할 수 없기 때문에, mysqlbinlog라는 프로그램을 이용해 텍스트의 형태로 바꿔서 확인한다. *** 참고자료 : Real MySQL - 3.8 MySQL 로그파일