2009년 9월 9일 수요일

로그파일감시3

3.FIFO 특수파일을 이용한 자작툴 제작

예를들어 General로그 파일의 옵션 --log=에 FIFO특수파일을 지정할 수 있다.
Unix계열에서는 문제없이 동작한다.

지정된 FIFO특수 파일을 읽어들이는 툴을 만들면 될 것이다.
자작툴이 FIFO를 읽어들이기 전용으로 오픈하는 것으로 해놓고 MySQL서버를 기동한다.

다음 코드는 FIFO파일을 읽어 그것을 표준출력에 보내는 단순한 C샘플코드이다.
인수처리, FIFO파일을 작성하는 처리, 에러처리, 시그날을 받았을 경우의 처리등 자세한 처리는 하지 않고 있으므로 본격적으로 사용하려면 수정을 해야할 것이다.

FIFO파일은 Linux에서는 mkfifo명령어로 간단히 작성가능하다.

FIFO특수파일 작성
shell$ mkfifo --mode=660 /tmp/mylog

/****샘플코드 ****/
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#define LOGFIFO "/tmp/mylog"

int main(int argc, char **argv)
{
int fd;
char buf[256];
ssize_t st_rd;

fd=open(LOGFIFO, O_RDONLY|O_NONBLOCK);
if ( fd == -1 ){
printf("can't open FIFO file.¥n");
exit(1);
}
while(1) {
st_rd = read(fd, buf, sizeof(buf)-1);
if ( st_rd > 0 ) {
buf[st_rd] = '¥0';
fputs(buf, stdout);
}
else if ( st_rd == 0 ) {
}
}//while end
close(fd);
exit(0);
}







로그파일감시2

2.swatch, logsurfer, logcheck등의 로그감시 툴을 사용

파일에 로그가 써 졌을 경우, swatch나 logsurfer, logcheck등의 툴을 사용할 수 있다.
swatch와 logsurfer는 데몬으로 파일을 감시한다.
logsurfer는 C로 만들어져 있고 swatch는 Perl로 기술되어 있다.

한개의 파일당 한개의 데몬을 띄울 필요가 있다. logcheck는 쉘 스크립트로 만들어져서 cron으로 기동되는 것을 전제로 하고 있다.




로그파일감시

에러로그 파일, slow query 로그파일, General로그파일을 감시하고 싶다는 것은 당연한 요구 일 것이다.
현재 다음과 같은 방법을 사용할 수 있다.
  1. syslog에 보낸다.
  2. swatch, logsurfer, logcheck등의 로그 감시툴을 사용
  3. FIFO특수파일을 이용한 자작 툴을 제작

1.syslog에 보낸다.

mysqld_safe을 개조해서 mysqld에서 받은 에러 메세지를 syslog에 보내는 방법이다.
mysqld_safe안에서 에러 출력을 logger등의 명령어에 보내면 실현가능하다.

syslog에 보낸 경우 syslog감시 툴을 사용할 수 있다.

mysqld_safe가 생성하지 않는 로그파일을 감시하는 경우는 tail등으로 파일을 볼 필요가 있다.
이 때 주의점은 파일이 변경된 경우 예를 들어 tail -f 실행중에 로그파일을 이동하고 FLUSH LOGS를 실행할 때등이다.

이 같은 경우에는 tail은 이동된 쪽의 파일을 보고 있기때문에 (최초로 열린 파일 디스크립터를 보고 있다. ) 로테이트로 새로 생긴 파일은 보지 않는 것을 주의해야한다.

GNU tail에서는 tail --follow=name --retry /data/host.log처럼 이 상황에 대처할 수 있는 옵션이 제공되고 있다.





2009년 9월 8일 화요일

로그활용8 - 바이너리로그

mysqlbinlog을 사용한 데이터 복구

mysqlbinlog를 사용해서 데이터를 복구하는 데에는 파이프라인을 직접 이용하는 방법과
일단 파일로 출력한 다음에 그것을 사용하는 방법이 있다.

shell$ ./bin/mysqlbinlog ./data/host-bin.000001 | ./bin/mysql

shell$./bin/mysqlbinlog ./data/host-bin.000001 < bin.000001
shell$./bin/mysql > bin.000001

바이너리로그 이벤트 확인

SHOW BINLOG EVENTS를 실행하면 바이너리로그 이벤트를 확인할 수 있다.
LIMIT구문이 없으면 모든 이벤트가 나오므로 주의해야한다.

SHOW BINLOG EVENTS
[IN '로그파일명'] [FROM 위치] [LIMIT [오프셋,] 갯수]