[MySQL] EVENT

참고

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>
  • 이벤트가 지정된 일시에 반복적으로 실행되도록 지정
  • STARTSENDS를 사용하여 이벤트의 실행 기간을 지정 가능
# 다음주부터 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);

links

social