레이블이 이벤트 스케줄러인 게시물을 표시합니다. 모든 게시물 표시
레이블이 이벤트 스케줄러인 게시물을 표시합니다. 모든 게시물 표시

2010년 6월 27일 일요일

Event Scheduler 3

이벤트 등록

이벤트 등록을 하기 위해서는 CREATE EVENT문을 사용한다. 구문은 아래와 같다.

CREATE EVENT [IF NOT EXISTS] 이벤트명
ON SCHEDULE 스케줄
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE]
[COMMENT '주석']
DO [BEGIN] 실행할 sql문; [실행할 sql문]; [END]

스케줄:
{ AT 타임 [+ INTERVAL 간격 [+INTERVAL 간격...]]
| EVERY 간격 [STARTS 타임] [ENDS 타임] }

타임:
{CURRENT_TIMESTAMP | 년월일시의 리터럴}

간격:
수 {YEAR|QUARTER|MONTH|DAY|HOUR|MINUTE|WEEK|SECOND|YEAR_MONTH|DAY
|HOUR|MINUTE| WEEK| SECOND | YEAR_MONTH|DAY_HOUR|DAY_MINUTE| DAY_SECOND| HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}


ON SCHEDULE구에서는 이벤트의 실행시간과 간격을 지정한다. 이것은 필수이다. DO 구 뒤에는 실행할 SQL문을 지정한다. 이것도 필수이다.

이벤트명은 64문자까지이고 대소문자 구분하지 않는다.

유니크한 이름을 설정해야한다.

CURRENT_TIMESTAMP는 현재의 일시를 나타내는 특별한 키워드이다.

ON SCHEDULE AT timestamp는 한번만 실행하는 이벤트의 경우에 사용한다.
Unix의 at같은 것이라고 생각하면 될 것이다. 여기에 지정하는 timestamp에는 날짜와 시간 모두 포함할 필요가 있다. 예를 들어 2010-06-27 11:01:00 처럼 지정한다.

또, 지정하는 날짜는 미래의 시간이 되지 않으면 안된다.

+INTERVAL은 복수 지정이 가능하다. + INTERVAL 1 WEEK + INTERVAL 4 HOUR처럼 지정한다.

ON SCHEDULE EVERY는 이벤트를 반복실행할 때 사용한다. Unix의 cron이라고 생각하면 될 것이다. EVERY구인 경우는 + INTERVAL은 지정불가능이다.
STARTS에서는 개시일시 ENDS로 종료일시를 지정한다.

또, DO이하에 지정하는 SQL문이 한개 인경우에는 BEGIN, END, DELIMITER 지정은 필요없다.
복수의 문을 지정하는 경우는 BEGIN ~END로 문장을 감싼다. 이때 안에 있는 SQL문은「 ;」로 구별하기 때문에 CREATE EVENT문 끝을 의미하는 「 ;」하고 구별할 수 없게 된다.
그래서 stored procedure와 마찬가지로 CREATE EVENT실행전에 DELIMITER 를 지정해서 문장의 끝을 나타내는 마크를 변경해 두어야한다.

ON COMPLETION PRESERVE는 이벤트가 완료하더라고 이벤트의 내용을 유지한채 두게 된다. 보통은 바로 삭제된다.

⧈이벤트 등록예

mysql> delimiter //
mysql> CREATE EVENT test_event
-> ON SCHEDULE EVERY 1 DAY
-> STARTS ' 2010-06-27 11:01:00'
-> ENABLE
-> DO
-> BEGIN
-> DELETE FROM test.log
-> WHERE test.log.artime < NOW();
-> END //

2010년 6월 7일 월요일

Event Scheduler

정기적으로 실행하거나 자동실행하고픈 스크립트등은 Event Scheduler에 등록해서 사용하면 편리하다.

Event Scheduler는 Unix의 cron이나 at에 해당되는 것이다. 이 기능은 MySQL 5.1.6에서 추가되었다.

Event Scheduler를 기록하는 테이블

Event Scheduler는 mysql.event테이블에 기록된다. MySQL 5.1미만에서 업그레이드해서 이 테이블이 존재하지 않는 경우는 mysql_fix_privilege_tables스크립트를 실행해서 테이블을 작성하면 된다.

mysql.event 테이블의 컬럼
db, name, body, definer, execute_at, interval_value, interval_field, created, modified, last_executed, starts, ends, status, on_completion, sql_mode, comment


옵션/서버 변수

Event Scheduler에 관한 mysqld옵션은 다음과 같다.

--event-scheduler={DISABLED|ON|1|OFF|0}

mysqld가 기동중인 경우는 다음의 SET문으로 Event Scheduler의 ON/OFF를 변경하는 것이 가능하다.
ON하고 1, OFF하고 0은 같은 의미이다. DISABLED에 해당하는 수치는 없다.

DISABLED의 경우, Event Scheduler기능이 무효화되고 SET문으로 ON/OFF변경 불가하다.

mysqld기동옵션에 --event-scheduler=DISABLED가 지정되면 서버 변수 event_scheduler값은 DISABLED로 된다.

옵션을 생략하면 OFF로 된다.

SET GLOBAL event_scheduler = {ON|OFF|1|0}

Event Scheduler가 기동되고 있는 경우는 SHOW PROCESSLIST로 전용 스레드가 한개 떠 있는 것을 확인할 수 있다.


mysql>SHOW PROCESSLIST;
id | User |Host | db |command | Time | State | Info
1 | root | localhost | mysql | Query | 0 | NULL | SHOW PROCESSLIST
2 |event_scheduler|localhost |NULL |Daemon |11 |Wating for next activation | NULL