MySQL Query 로깅: general_log 활용하기

한봉훈·2025년 1월 23일

개요

Spring 애플리케이션에서 JPA/Hibernate SQL 로깅은 application.yml 설정으로 쉽게 확인할 수 있지만, 이는 애플리케이션 레벨의 로깅입니다. 실제 데이터베이스에서 어떤 쿼리가 실행되는지 모니터링하고 싶다면 MySQL의 general_log 기능을 활용할 수 있습니다.

로깅 설정 방법

1. 로그 저장 위치 선택

MySQL은 두 가지 방식으로 쿼리를 로깅할 수 있습니다:

-- 파일로 저장
SET GLOBAL log_output = 'FILE';

-- 테이블로 저장
SET GLOBAL log_output = 'TABLE';

2. 로깅 활성화

SET GLOBAL general_log = 'ON';

로그 확인하기

테이블에 저장된 로그를 확인하는 유용한 쿼리들:

-- 최근 실행된 쿼리 10개 보기
SELECT event_time, argument 
FROM mysql.general_log 
ORDER BY event_time DESC 
LIMIT 10;

-- 특정 테이블 관련 쿼리만 보기
SELECT * FROM mysql.general_log 
WHERE argument LIKE '%user_table%'
ORDER BY event_time DESC;

-- 최근 1분 동안의 쿼리 보기
SELECT event_time, argument 
FROM mysql.general_log 
WHERE event_time > NOW() - INTERVAL 1 MINUTE
ORDER BY event_time DESC;

⚠️ 주의사항

  1. 성능 영향

    • general_log는 모든 쿼리를 기록하므로 성능에 영향을 줄 수 있습니다
    • 로컬 개발 환경에서만 사용하는 것을 강력히 권장합니다
    • 운영 환경에서는 필요할 때만 잠시 켰다가 끄는 것이 좋습니다
  2. 저장 공간

    • TABLE 옵션 사용 시 mysql.general_log 테이블 크기가 계속 증가합니다
    • 주기적으로 로그를 비워주어야 합니다
    TRUNCATE TABLE mysql.general_log;
  3. 로그 테이블 제약

    • mysql.general_log 테이블은 시스템 테이블이라 직접 수정이 불가능합니다
    • 로그 분석이 필요하면 별도 테이블로 복사해서 작업해야 합니다
  4. 권한 설정

    • 로그 조회를 위해서는 적절한 권한이 필요합니다
    GRANT SELECT ON mysql.* TO 'user'@'host';
    FLUSH PRIVILEGES;

로깅 비활성화

작업이 끝난 후에는 반드시 로깅을 꺼야합니다:

SET GLOBAL general_log = 'OFF';

활용 팁

  • JPA/Hibernate 사용 시 실제 실행되는 쿼리 확인
  • 성능 최적화를 위한 쿼리 분석
  • 데이터베이스 문제 해결을 위한 디버깅

정리

MySQL general_log는 강력한 디버깅 도구이지만, 성능과 저장 공간에 영향을 주므로 신중하게 사용해야 합니다. 로컬 개발 환경에서만 사용하고, 필요한 작업이 끝나면 반드시 비활성화하는 것이 좋습니다.

참고

MySQL Troubleshooting : 쿼리 문제, 원인을 알면 해결은 쉽다

profile
백엔드 기록

0개의 댓글