참고
MySQL Documentation 13.1.13 CREATE EVENT Statement
prerequisite
- EVENT 권한을 가지고 있어야 한다.
이벤트 생성 구문
CREATE
[DEFINER = user]
EVENT
[IF NOT EXISTS]
event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE | DISABLE ON SLAVE]
[COMMENT 'string']
DO event_body;
schedule: {
AT timestamp [+ INTERVAL interval] ...
| EVERY interval
[STARTS timestamp [+ INTERVAL interval] ...]
[ENDS timestamp [+ INTERVAL interval] ...]
}
interval:
quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
DEFINER
- deafult:
CURRENT_USER
. CREATE EVENT문을 실행하는 유저이다. - 이벤트 실행 시의 접근 권한을 체크 하는데 사용(작동시키는 유저가 아니다).
- 'user_name'@'host_name' 과 같이 지정할 수 있다.
IF NOT EXISTS
- 스키마에 동일한 이름의 이벤트가 존재시, CREATE EVENT를 스킵하도록 한다(no action).
event_name
schema_name.event_name
- 스키마를 지정하지 않을 시 현재 사용되고 있는 스키마에 생성 된다.
- 같은 스키마 안에서는 동일 이벤트명이 존재 할 수 없다.
- 최대 64글자이며, 소문자와 대문자를 구별하지 않는다. (ex. myname 이벤트 존재시 MyName 이라는 이벤트는 생성 불가)
schedule
- 정의된 event_body가 실행되느 시간, 빈도 및 기간을 결정
- 내장 함수, 사용자 변수,
SELECT FROM DUAL
를 사용하여 지정 할 수도 있다. - 테이블 참조, 프로시저, Loadable Function(아래 참고) 사용불가
- MySQL Documentation 12.2 Loadable Function Reference
- 기본 제공(built-in)되지는 않지만 서버 기능을 확장하기 위해 런타임에 로드될 수 있는 함수, 또는 기능 제거를 위한 언로디드 되는 함수
- Loadable Function는 서버의 일부로 구현되고 항상 사용할 수 있는 내장(기본) 함수와 대조
- ON SCHEDULE에서 사용되는 시간은 현재 세션의 time_zone 값을 사용한다.
- 이러한 시간은 이벤트 스케쥴링과 이벤트 실행시 이벤트 내부에서 사용된다.
- 또한 UTC로 변환되어 이벤트 내부에 time zone과 함께 저장된다.
- 이벤트 생성 후에는 서버 time zone 변경이나 Daylight saving time(Summer Time, 하절기에 표준시를 한 시간 앞당긴 시간을 쓰는 것)과 같은 변화에 영향을 받지 않는다.
- event times에 대한 자세한 내용은 아래 링크 참고
- 아래와 같은 두가지 포맷을 취할 수 있다.
one-time event
ON SCHEDULE AT <schedule>
- 이벤트가 지정된 일시에 한 번만 실행되도록 지정
- 값은 날짜와 시간이 모두 포함된 형식(ex. AT '2022-07-10 12:00:00')
- 또는 날짜와 시간이 확인이 되는 표현(ex. AT CURRENT_TIMESTAMP + INTERVAL 3 WEEK + INTERVAL 2 DAY)
- 만약 CREATE EVENT 구문 실행 시점에 지정된 일시가 이미 지났을 경우 아래와 같은 warning 발생
Level: Note
Code: 1588
Message: Event execution time is in the past and ON COMPLETION NOT
PRESERVE is set. The event was dropped immediately after
creation.
repeat event
ON SCHEDULE EVERY <schedule>
- 이벤트가 지정된 일시에 반복적으로 실행되도록 지정
- STARTS와 ENDS를 사용하여 이벤트의 실행 기간을 지정 가능
# 다음주부터 3달 뒤까지 2주마다 실행되도록 스케쥴링
ON SCHEDULE EVERY 2 WEEK STARTS CURRENT_TIMESTAMP + INTERVAL 1 WEEK ENDS CURRENT_TIMESTAMP + INTERVAL 3 MONTH
- 반복적으로 실행되도록 지정된 이벤트가 다음 이벤트 실행 이전에 완료되지 않을 경우 실행되는 이벤트는 여러 인스턴스가 될 수 있다.
- 이를 방지하기 위해서는 동시 인스터스를 방지하기 위한 처리필요(ex.
GET_LOCK()
을 사용한 로우 또는 테이블 lock)
ON COMPLETION [NOT] PRESERVE
- default:
ON COMPLETION NOT PRESERVE
- 기본적으로 이벤트는 기간만료 시에 drop 되지만 해당 옵션(ON COMPLETION PRESERVE)을 사용하여 유지 하도록 할 수 있다.
ENABLE | DISABLE | DISABLE ON SLAVE
- default:
ENABLE
- 해당 이벤트가 활성화(active) 여부를 지정
- 이는 ALTER EVENT와 함께 사용할 때 가장 유용하다. 13.1.3, “ALTER EVENT Statement”
DISABLE ON SLAVE
지정 시 복제 서버에 동일한 이벤트가 생성 되지만 DISABLE 상태가 된다.
COMMENT 'string'
- 해당 이벤트에 대한 description
- 최대 64자까지 입력이 가능하다.
event_body
- 이벤트 작동 시에 실행되는 구문
- 복수의 구문(compound-statement)을 실행 시키기 위해서는
BEGIN ... END
를 사용한다. - 몇몇 구문은 event_body에서 허용되지 않는다. Section 25.8, “Restrictions on Stored Programs”
- MySQL은 이벤트가 생성되었을 때의 sql_mode 시스템 환경변수를 저장한다. 이벤트가 작동할 때는 현재 서버의 sql_mode가 아닌 생성 당시의 셋팅으로 실행된다.
- 만약 ALTER EVENT 구문을 포함시키면 생성은 가능하지만 이벤트 작동시에 에러가 발생한다.
- 결과 집합만 반환하는 SELECT 또는 SHOW와 같은 구문은 MySQL Monitor에 전송되지 않으며, 또한 어느 곳에도 저장되지 않음(물론 SELECT ... INTO, INSERT INTO ... SELECT는 사용가능)
- event_body에 파라미터를 넘기는 것은 불가능, 하지만 stored routine(procedure or function)을 호출하여 처리하는 것은 가능하다.
# 예시
CREATE EVENT e_call_myproc
ON SCHEDULE
AT CURRENT_TIMESTAMP + INTERVAL 1 DAY
DO CALL myproc(5, 27);