본문 바로가기

CS BASIC/데이터베이스(Database)

[MySQL] MySQL Event Scheduler

MySQL Event Scheduler란?

This statement creates and schedules a new event. The event does not run unless the Event Scheduler is enabled. For information about checking Event Scheduler status and enabling it if necessary, see Section 25.4.2, “Event Scheduler Configuration”.

https://dev.mysql.com/doc/refman/8.0/en/create-event.html

 

MySQL :: MySQL 8.0 Reference Manual :: 13.1.13 CREATE EVENT Statement

13.1.13 CREATE EVENT Statement 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 interv

dev.mysql.com

 

 프로젝트를 수행하다보면 주기적으로 매일 xx시, 매시 정각 등 일정한 시간 주기나 오늘로부터 3일 후 와 같은 특정 시점에 데이터베이스 작업이 발생해야 하는 경우가 있습니다. Server나 OS 차원에서도 이러한 작업을 수행하는 것이 가능하겠지만, MySQL 에서도 이러한 작업을 할 수 있도록 Event Scheduler를지원합니다.


 

MySQL Event Scheduler 문법

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
  • event_body 절에는 수행할 작업 = 쿼리문 을 작성합니다.

 

TODO List

  • 일정 시간마다 데이터를 추가하는 이벤트 스케쥴러를 작성합니다
  • 일정 시간 후 트리거처럼 테이블 전체를 초기화하는 이벤트 스케쥴러를 작성합니다.
  • 일정 기간 동안 테이블에 데이터를 추가하는 이벤트 스케쥴러를 작성합니다.
  • 특정 시간 이후부터 쭉 작업하는 이벤트 스케쥴러도 작성 가능합니다.

step 0. DATABASE를 생성하고, Dummy 데이터를 추가합니다.

  • 본 포스트에서 사용한 테스트 DB 명은 아래의 쿼리문으로 생성되었습니다.
-- database 생성
create database `event_schedule`;
use event_schedule;
  • 다음의 쿼리문을 통해 test table을 생성합니다.
create table movie (
	movie_index VARCHAR(50),
	movie_title VARCHAR(3000),
	genre VARCHAR(100),
	audience INT,
	total_sales VARCHAR(300)
);
  • 생성된 테이블을 확인합니다.

 

  • 아래의 사이트를 이용하여 Dummy Data를 생성합니다.

https://www.mockaroo.com/

 

Mockaroo - Random Data Generator and API Mocking Tool | JSON / CSV / SQL / Excel

Mock your back-end API and start coding your UI today. It's hard to put together a meaningful UI prototype without making real requests to an API. By making real requests, you'll uncover problems with application flow, timing, and API design early, improvi

www.mockaroo.com

 

  • 이번 예제에서 사용한 테스트용 dummy.sql 파일

create_movie_table.sql
0.05MB

 

  • 테이블에 잘 데이터가 들었는지 확인

 

 


TODO 1. 1분마다 데이터가 등록되는 이벤트 스케쥴러 작성

-- 이벤트 스케쥴러 생성
create event data_input
on schedule every 1 minute
comment 'movie 데이터 삽입'
do
insert into movie 
(movie_index, movie_title, genre, audience, total_sales) 
values 
('45963-833', 'Loving Annabelle', 'Drama|Romance', 112, '$15501.60');

 

 

  • 설정한 시간 이후에 select 절을 통해서 제대로 작동하는지 확인

→ 이벤트를 처음 등록한 순간 이벤트 스케쥴러의 작업을 수행하고 시간을 잽니다.

 

  • 시간이 지날 수록 데이터가 1개씩 추가되는 결과를 보입니다.

 

 


TODO 2. 현재시각으로부터 5분 후 모든 데이터를 삭제하는 이벤트 스케쥴러

--
create event data_reset
on schedule AT CURRENT_TIMESTAMP + INTERVAL 10 second
comment 'movie data 초기화'
do
truncate table movie;
  • 스케쥴러가 잘 등록 되었는 지 체크

  • 정확히 5분 후 테이블이 초기화 되었음을 확인

 

💡 여기서 잠깐!

  • 이벤트 스케쥴러는 아래의 명령어를 통해 현재 활성화 된 것을 확인할 수 있습니다.
select * from information_schema.events;

그러나, 일정 시간 후 한 번만 작동하는 스케줄러나, 일정 기간 동안 반복 후 종료된 이벤트 스케줄러는 작업이 종료된 이후 위의 명령어로 조회해도 나오지 않습니다.

 

 


TODO 3. 특정 기간 동안만 반복 실행되는 이벤트 스케줄러

create event data_insert2
on schedule every 3 second 
starts CURRENT_TIMESTAMP + INTERVAL 10 second
ends CURRENT_TIMESTAMP + INTERVAL 20 second
comment '지금부터 10초 후에 20초간 3초마다 데이터 추가'
do
insert into movie 
(movie_index, movie_title, genre, audience, total_sales) 
values 
('45963-833', 'Loving Annabelle', 'Drama|Romance', 112, '$15501.60');

 

  • 일정 주기마다 작업이 잘 수행되었음 확인할 수 있습니다.

 

  • 지금 설정한 이벤트 스케쥴러도 작업이 모두 종료되면 조회되지 않습니다.