서론
로그 파일은 MySQL 상태 진단의 가장 기본 도구이므로 로그 파일을 잘 살펴보자
4.4.1 에러 로그 파일
MySQL 내부에서 발생하는 각종 에러, 경고, 서버 시작/종료 정보 등을 기록
4.4.1.1 서버 시작/파라미터 적용 확인 메시지
MySQL을 재시작하면 에러 로그에 다음이 남음:
- 서버 시작 성공 여부(ready for connections)
- 파라미터가 정상 적용되었는지
- 잘못된 파라미터가 무시됐는지(ignore)
왜 중요한가?
→ MySQL 설정 파일(my.cnf)을 수정하고 재시작할 때, 반드시 에러 로그로 설정 적용 여부를 확인해야 하기 때문
4.4.1.2 비정상 종료 후 InnoDB 복구 메시지
서버가 강제로 꺼졌거나 비정상 종료되면, 다음 실행 시 InnoDB가 자동 복구(recovery)를 시도함
복구 내용 예:
- 완료되지 않은 트랜잭션 롤백
- 디스크에 기록되지 않은 버퍼 풀 데이터 flush
복구 실패 시:
innodb_force_recovery 를 1~6 단계로 설정해 강제 복구해야 할 수도 있음
4.4.1.3 쿼리 처리 도중 발생하는 문제 메시지
- deadlock
- foreign key 오류
- 디스크 I/O 문제
- 테이블 손상
4.4.1.4 비정상 커넥션 종료
- 클라이언트가 소켓을 정상 종료하지 않고 갑자기 끊을 때 기록됨
원인 예:
- 애플리케이션에서 커넥션 close 안 함
- 네트워크 불안정
- max_connect_errors 제한을 넘김 → host blocked 발생
4.4.1.5 InnoDB 모니터링 / 상태 정보 출력
SHOW ENGINE INNODB STATUS or deadlock monitor, lock monitor 활성화 시
→ 매우 큰 양의 정보가 에러 로그에 출력됨
문제: 모니터링을 켜둔 채 방치하면 에러 로그가 수십 GB가 될 수도 있음
4.4.1.6 MySQL 종료 메시지
- 정상 종료:
Received SHUTDOWN from user ...
- 비정상 종료: segmentation fault → 스택 트레이스 출력
=> 이 메시지가 서버 다운 원인을 찾는 유일한 실마리가 됨
4.4.1 제너럴 쿼리 로그 파일
MySQL이 수신한 모든 쿼리를 기록하는 로그
특징
- 쿼리가 실행되기 ‘전’에 기록됨
(실행 실패해도 로그에 남음)
- 너무 많은 로그가 쌓이므로 운영환경에서는 거의 사용하지 않음
확인 방법
SHOW GLOBAL VARIABLES LIKE 'general_log%';
- general_log = ON/OFF
- general_log_file = 로그 파일 위치
- log_output = FILE or TABLE
출력 예시
Connect root@localhost
Query Show databases
Query Select @@version_comment
Query Show tables
4.4.1 슬로우 쿼리 로그
튜닝 대상 쿼리를 찾을 때 가장 중요한 로그
언제 기록되는가?
long_query_time 에 설정된 시간 이상 걸린 쿼리를 기록함.
long_query_time 기본값은 10초
- 소수점으로 설정하면 마이크로초까지 가능
- 예:
SET GLOBAL long_query_time = 0.1; -- 100ms 이상이면 기록
기록되는 정보
- Time: 쿼리가 끝난 시간 (시작 시간이 아님)
- User@Host: 실행 사용자
- Query_time: 쿼리 총 실행 시간
- Lock_time: MySQL 엔진 레벨의 테이블 락 대기 시간
(InnoDB 레코드 잠금과는 무관)
- Rows_examined: 얼마나 많은 레코드를 읽었는가
- Rows_sent: 클라이언트에 보낸 행 수
Lock_time이 InnoDB에서 의미 없는 이유
- InnoDB 엔진의 레코드 수준(lock)은 MySQL 서버에서 측정 못 함
- Lock_time은 거의 항상 매우 작게 나옴 → 튜닝 지표로 부적절
4.4.3.1 슬로우 쿼리 통계
파일 전체를 통계로 요약한 정보
- 전체 실행 횟수
- 평균/최소/최대 쿼리 시간
- 평균 Lock_time
- 평균 rows_examined / rows_sent
- Query size
4.4.3.2 쿼리별 실행 횟수 / 누적 실행 시간 랭킹
- 슬로우 쿼리를 정렬해서 “문제 쿼리 순위”를 자동으로 보여 줌
- 이걸 통해 무엇부터 튜닝해야 할지 바로 알 수 있음
1) 특정 SELECT orders joined …
2) 특정 SELECT users_details…
3) …
4.4.3.3 각 쿼리의 상세 정보
각 랭킹 쿼리마다 아래 내용 제공:
- 실행 횟수
- 전체/평균 쿼리 시간
- 전체/평균 Lock_time
- Rows_examined / Rows_sent
- 쿼리 히스토그램(1ms ~ 10초 이상 밀도)
- 해당 쿼리의 실제 SQL
- 사용 테이블 구조
- EXPLAIN 결과