MySQL 일반 로그(General Log)는 어떻게 설정하나요?
💡 MySQL **일반 로그(General Log)**는 서버에 클라이언트가 접속하거나 접속을 종료할 때의 정보를 포함하여, 클라이언트로부터 받아들이는 모든 SQL 명령문을 기록합니다. mysqld는 명령문을 실행된 순서가 아닌 받는 순서대로 쿼리 로그에 기록하며, 일반적인 쿼리문의 모든 실행 결과를 기록합니다.
일반 로그 활성화 방법
MySQL 일반 로그를 활성화하려면 my.cnf 파일에 로그 옵션을 추가하고 MySQL 데몬을 재시작해야 합니다.
기본 설정 (호스트명.log 파일로 저장)
[mysqld]
port = 3306
socket = /tmp/mysql.sock
back_log = 50
max_connections = 100
max_connect_errors = 10
table_open_cache = 2048
max_allowed_packet = 16M
binlog_cache_size = 1M
max_heap_table_size = 64M
read_buffer_size = 2M
log-bin=mysql-bin
binlog_format=mixed
# 일반 로그 활성화
log
위 설정은 MySQL 데이터 디렉토리에 "호스트명.log" 파일로 일반 로그를 저장합니다.
사용자 지정 경로 설정
별도의 경로에 원하는 이름으로 저장하려면 경로를 추가하여 지정할 수 있습니다.
[mysqld]
port = 3306
socket = /tmp/mysql.sock
back_log = 50
max_connections = 100
# 일반 로그를 지정한 경로에 저장
log = /var/log/mysql.log
slow_query_log
long_query_time = 2
중요사항:
- 별도의 경로를 지정할 경우, 해당 디렉토리가 mysql user 권한으로 쓰기가 가능해야 합니다.
- 디렉토리 권한이 없으면 로그 파일이 생성되지 않습니다.
로그 파일 형태
일반 로그는 다음과 같은 형식으로 MySQL 접속, 명령 및 쿼리 실행, 종료 등 모든 이벤트를 기록합니다.
/home/mysql/bin/mysqld, Version: 5.5.28-log (Source distribution). started with:
Tcp port: 3306 Unix socket: /tmp/mysql.sock
Time Id Command Argument
130226 9:27:45 1 Connect root@localhost -> mysql 접속 로그
1 Query select @@version_comment limit 1
130226 9:27:48 1 Query show databases
130226 9:27:50 1 Query show tables -> show 명령
130226 9:30:06 1 Query SELECT DATABASE() -> mysql 선택 로그
1 Init DB mysql
130226 9:30:11 1 Query select * from user -> select 쿼리 로그
130226 9:30:13 1 Quit -> mysql 접속 종료 로그
로그 형식 설명
로그 항목:
- Time: 이벤트 발생 시간 (YYMMDD HH:MM:SS 형식)
- Id: 연결 ID (connection ID)
- Command: 실행된 명령 유형 (Connect, Query, Init DB, Quit 등)
- Argument: 실행된 SQL 명령문 또는 인수
Command 종류:
- Connect: 클라이언트가 서버에 접속
- Query: SQL 쿼리 실행 (SELECT, SHOW 등)
- Init DB: 데이터베이스 선택 (USE 명령)
- Quit: 클라이언트가 연결 종료
일반 로그 분석 예시
위 로그 예시를 시간 순서대로 분석하면 다음과 같습니다:
- 09:27:45 - root@localhost가 MySQL에 접속
- 09:27:45 - MySQL 버전 정보 조회 (
select @@version_comment limit 1) - 09:27:48 - 데이터베이스 목록 조회 (
show databases) - 09:27:50 - 테이블 목록 조회 (
show tables) - 09:30:06 - 현재 데이터베이스 확인 (
SELECT DATABASE()) - 09:30:06 - mysql 데이터베이스 선택 (
Init DB mysql) - 09:30:11 - user 테이블 조회 (
select * from user) - 09:30:13 - MySQL 접속 종료 (
Quit)
일반 로그 활성화/비활성화 (동적 변경)
MySQL 5.1 이상에서는 재시작 없이 런타임에 일반 로그를 활성화하거나 비활성화할 수 있습니다.
-- 일반 로그 활성화
SET GLOBAL general_log = 'ON';
-- 일반 로그 비활성화
SET GLOBAL general_log = 'OFF';
-- 로그 파일 경로 변경
SET GLOBAL general_log_file = '/var/log/mysql-query.log';
-- 현재 일반 로그 설정 확인
SHOW VARIABLES LIKE 'general_log%';
출력 예시:
+------------------+------------------------+
| Variable_name | Value |
+------------------+------------------------+
| general_log | ON |
| general_log_file | /var/log/mysql.log |
+------------------+------------------------+
일반 로그 로테이션
일반 로그는 모든 SQL 명령문을 기록하므로 파일 크기가 빠르게 증가합니다. 주기적인 로그 로테이션이 필요합니다.
logrotate 설정 예시
/etc/logrotate.d/mysql 파일 생성:
/var/log/mysql.log {
daily
rotate 7
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
/usr/bin/mysql -e "FLUSH LOGS"
endscript
}
옵션 설명:
daily: 매일 로테이션rotate 7: 최근 7개의 로그 파일 유지compress: 오래된 로그 압축postrotate: 로테이션 후FLUSH LOGS실행하여 새 로그 파일 생성
수동 로그 플러시
FLUSH LOGS;
이 명령은 현재 로그 파일을 닫고 새 로그 파일을 엽니다.
일반 로그 vs 슬로우 쿼리 로그
| 항목 | 일반 로그 | 슬로우 쿼리 로그 |
|---|---|---|
| 기록 대상 | 모든 SQL 명령문 | 설정한 시간보다 느린 쿼리만 |
| 목적 | 디버깅, 감사 | 성능 최적화 |
| 성능 영향 | 높음 (많은 I/O) | 낮음 |
| 파일 크기 | 빠르게 증가 | 상대적으로 작음 |
| 운영 환경 사용 | 권장하지 않음 | 권장 |
주의사항
성능 영향:
- 일반 로그는 모든 쿼리를 기록하므로 디스크 I/O가 크게 증가합니다.
- 트래픽이 많은 운영 서버에서는 성능 저하가 발생할 수 있습니다.
- 개발 환경이나 디버깅 목적으로만 사용하는 것을 권장합니다.
디스크 공간:
- 로그 파일이 빠르게 증가하므로 디스크 공간을 주기적으로 모니터링해야 합니다.
- 로그 로테이션을 반드시 설정하세요.
권한 문제:
- 로그 파일 경로의 디렉토리는 mysql 유저가 쓰기 권한을 가져야 합니다.
- 권한이 없으면 MySQL 시작이 실패할 수 있습니다.
# 로그 디렉토리 권한 설정
chown mysql:mysql /var/log/mysql
chmod 755 /var/log/mysql
일반 로그 활용 사례
1. 애플리케이션 디버깅
- 애플리케이션이 실행하는 정확한 SQL 문을 확인
- ORM이 생성하는 쿼리 분석
2. 보안 감사
- 어떤 사용자가 어떤 쿼리를 실행했는지 추적
- 비정상적인 접근 시도 탐지
3. 마이그레이션 검증
- 데이터베이스 마이그레이션 시 실행되는 모든 SQL 확인
- 예상치 못한 쿼리 실행 여부 점검
4. 연결 문제 진단
- 클라이언트 연결/종료 패턴 분석
- 연결 풀 동작 확인
문제 해결
문제 1: 로그 파일이 생성되지 않음
# 디렉토리 권한 확인
ls -ld /var/log/mysql
# mysql 유저 권한 부여
chown mysql:mysql /var/log/mysql
chmod 755 /var/log/mysql
# MySQL 재시작
systemctl restart mysqld
문제 2: 로그가 기록되지 않음
-- 일반 로그 설정 확인
SHOW VARIABLES LIKE 'general_log%';
-- 일반 로그 활성화
SET GLOBAL general_log = 'ON';
문제 3: 로그 파일이 너무 큼
# 현재 로그 파일 크기 확인
ls -lh /var/log/mysql.log
# 즉시 로그 로테이션
logrotate -f /etc/logrotate.d/mysql
# 또는 MySQL에서 플러시
mysql -e "FLUSH LOGS"