2009년 8월 31일 월요일

로그활용3 - 일반로그

log(--log)
MySQL서버처리를 상세하게 기록하는 로그파일이다. 언제 어떤유저(포함하는 호스트)가 접속해서 어떤 쿼리를 실행했는가가 상세하게 기록된다.
기록은 MySQL서버가 접수한 순서대로 기록된다. 트랜잭션 상태는 고려하는 않는다.
어플리케이션과 연계 디버그나 보안감사에 사용할 수 있다.

이 옵션을 지정하면 general-log옵션이 자동적으로 ON이 된다.
다음처럼 지정한다.

log[=파일명]

파일이름을 생략하면 datadir/호스트명.log파일이 된다. 이 파일은 FLUSH LOGS로는 로테이트되지 않는다. 또 서버 재기동시에도 로테이트하지 않는다.
이 파일을 로테이트하려면 Unix계열에서는 다음처럼 한다.

log를 로테이트한다.
root@shell# mv hostname.log hostname.log.0
root@shell# mysqladmin flush-logs

general-log(--general-log)

general-log는 MySQL5.1이상에서의 기능이다. 이 옵션을 지정하면 mysql.general_log테이블에 General로그가 출력된다.
옵션은 다음처럼 지정한다.

general-log

또, MySQL서버 기동중에 SET문으로 값을 변경하면 유효로 할 수 있다.

MySQL서버기동중에 general-log를 유효로 세팅
mysql> SET GLOBAL general_log=1;

mysql.general_log테이블이 존재하지 않는 경우는 mysql_fix_privilege_tables스크립트를 실행하고 테이블을 작성해야한다. 이 테이블은 CSV스토리지엔진으로 작성되어 있다.
또, 이 옵션이 지정된 경우 보통 --log로 지정된 파일에는 로그를 기록하지 않는다.
주의점은 이 테이블의 캐릭터셋이다.

general_log
CREATE TABLE `general_log`(
...
중략
`command_type` varchar(64) DEFAULT NULL,
`argument` mediumtext
) ENGINE=CSV DEFAULT CHARSET=utf8

이 처럼 실행한 SQL문은 argument헤더에 utf8캐릭터셋으로 기록된다.
만약 UTF-8로 변환불능한 문자가 쿼리에 포함되어 있었을 경우는 이 부분 기록은 옳바르지 않게 된다.
덧붙여 말하면 mysql.general_log테이블에 대해서 DELETE/UPDATE/INSERT문은 실행할 수 없다. FLUSH LOGS를 실행해도 내용은 없어지지 않지만 TRUNCATE TABLE문을 사용해서 내용을 전부 제거하는 것은 가능하다. 또 이 옵션이 무효인 경우(general로그를 출력하지 않을 때)에는 ALTER TABLE문으로 스토리지엔진을 바꾸거나 DROP TABLES문으로 파기하는 것도 가능하다.

log-output(--log-output)

log-output는 general로그와 slow query로그 출력위치를 지정한다.

log-output=값[,값]

값에는 TABLE, FILE, NONE을 지정할 수 있다.

TABLE: mysql.general_log테이블에 쓴다.
FILE: --log옵션으로 지정된 파일에 쓴다.
NONE:로그를 출력하지 않는다. 다른 지정보다 우선도가 높다.

또 , 값을 "," 로 복수 지정하는 것도 가능하다.

log-output=FILE,TABLE

이 경우는 파일과 테이블 양쪽에 출력하게 된다.
log-output는 MySQL서버기동중에 SET문을 사용해서 변경하는 것도 가능하다.

MySQL서버 기동중에 출력위치를 변경
mysql>SET GLOBAL log_output="FILE,TABLE";