본문 바로가기
프로젝트

[SuiteCare] MySQL에서 일정 시간 후 자동으로 데이터 업데이트하기

by 네모세모동동 2024. 4. 9.

진행하는 프로젝트에서 공고 마감을 설정하는 부분에서 설정해놓은 공고 기재 날짜가 지나면 공고 마감 상태로 변경하는 작업을 수행하기 위해 하루가 지날 때마다 자동으로 공고에 대한 상태 컬럼을 UPDATE 해주는 기능을 구현해야했다.

 

MySQL에 이벤트 스케줄러(Event Scheduler) 기능을 사용해서 이를 구현할 수 있었다.

 

이 포스팅에서 이벤트 스케줄러를 사용하는 방법에 대해서 적어보려한다.

 

 

1. 기능 사용을 위한 설정하기

이벤트 스케줄러를 사용하기 위해서는 사용할 수 있도록 설정해줘야한다.

 

일단 아래 쿼리문으로 설정된 상태를 확인할 수 있다.

SHOW VARIABLES LIKE 'event%';

< SHOW VARIABLES LIKE 'event%' 쿼리문의 결과 >

 

 

만약 OFF로 설정되어있다면 아래 쿼리문을 사용하여 상태를 ON으로 변경해준다!

SET GLOBAL event_scheduler = ON;

 

 

 

2. Event Scheduler 생성하기

아래 쿼리문은 이벤트 스케줄러를 생성하기 위한 기본 구문이다.

CREATE EVENT [IF NOT EXISTS] event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE | DISABLE ON {REPLICA | SLAVE}]
[COMMENT 'string']
DO event_body;

 

  • CREATE EVENT 이벤트명
  • ON SCHEDULE 일정
  • ON COMPLETION PRESERVE : 만료된 이벤트를 유지 (NOT을 쓰면 이벤트 수행 후 이벤트 삭제)
  • ENABLE | DISABLE | DISABLE ON {REPLICA | SLAVE} : 이벤트의 활성화 상태를 제어하는 옵션
৹ ENABLE(Default) : 이벤트가 생성되자마자 활성화. 지정된 스케줄에 따라 이벤트가 자동으로 실행된다.
৹  DISABLE : 이벤트가 비활성화 상태로 생성. 이벤트를 실행하려면 나중에 수동으로 활성화해야 한다.
৹  DISABLE ON {REPLICA | SLAVE} : 주로 복제 환경에서 사용. 마스터 서버에서는 이벤트가 활성화되지만, 복제본(레플리카 또는 슬레이브)에서는 이벤트가 비활성화된다. 이는 데이터 일관성을 유지하고 복제 환경에서 불필요한 이벤트 실행을 방지하기 위함이다.

 

  • COMMENT 주석내용
  • DO 수행할 명령

 

 

📌 특정 날짜에 실행하는 일회성의 이벤트인 경우

CREATE EVENT IF NOT EXISTS one_time_log
ON SCHEDULE AT CURRENT_TIMESTAMP
DO
  [수행할 명령]

 

📌 반복 이벤트인 경우

CREATE EVENT recurring_log
ON SCHEDULE EVERY 1 MINUTE
STARTS CURRENT_TIMESTAMP (이벤트 스케줄러를 시작할 시간)
ENDS CURRENT_TIMESTAMP + INTERVAL 1 HOUR (이벤트 스케줄러를 끝내는 시간)
DO
  [수행할 명령]
EVERY YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | WEEK

 

 

📌 프로젝트에서 사용한 이벤트 스케줄러

CREATE EVENT update_recruitment_status
ON SCHEDULE EVERY 1 DAY
STARTS '2024-04-08 00:00:00'
COMMENT 'update recruitment status'
DO
UPDATE recruitment
SET status = 'E'
WHERE status = 'P' AND expire_at < now();

 

 

 

 

2. Event Scheduler 확인하기

SELECT * FROM information_schema.events;

 

생성되어 있는 이벤트 스케줄러를 확인할 수 있다.

 


[출처]