본문 바로가기

Technical/DBMS

MySQL Tip - General log 활용


Database 내에서 발생하는 모든 쿼리들을 logging할 필요가 있을 때
SHOW VARIABLES LIKE 'general_log';
SHOW VARIABLES LIKE 'log_output';

SET GLOBAL general_log = 1;
SET GLOBAL log_output = 'table';
-- 필요시에만 켜서 사용

SET GLOBAL general_log = 0;
SET GLOBAL log_output = 'file';
-- 평상시에는 이렇게 disable해 두어야 엔진의 성능에 부담이 가지 않으므로 주의

Query logging table: mysql.general_log

* MySQL에서는 milli-second 단위로 시간을 처리하지 않으므로 timestamp는 초 단위까지만 기록된다.
ALTER TABLE mysql.general_log 
    ADD COLUMN seq BIGINT UNSIGNED NOT NULL AUTO_INCREMENT AFTER argument,
    ADD PRIMARY KEY(seq),
    ENGINE=MYISAM;
으로 log table을 alter한 후 order by seq desc와 같이 select 해서 실행 순서대로 정렬하여 활용하면 된다.
MySQL에서 사용되는 기본 general_log 테이블에는 index 가 없으므로, 위와 같이 index 를 이용한 조회를 하지 않으면
데이터베이스 성능에 부담을 주게 되며,

확인이 끝 난 후 반드시 general_log를 disable해 두어야만 성능상의 문제로 재난이 생기지 않으니 반드시 유의해야 한다.

general_log 테이블을 비워야 할 경우, delete 쿼리를 수행하면 '로그테이블에 대한 처리 불가'라고 오류가 발생하게 되므로
아래와 같이 처리해야 한다.
SET GLOBAL general_log = OFF; -- log를 계속 쌓도록 하려면 생략
USE mysql;
create table tmp_general_log like general_log;
rename table generlal_log to old_general_log, tmp_general_log to general_log;