MySQL 스케줄러

이상민·2025년 6월 25일
0

1. MySQL 스케줄러란?

MySQL의 Event SchedulerCron처럼 정기적으로 실행되는 쿼리 작업을 DB 레벨에서 자동으로 처리해주는 기능.

예를 들어: 매일 0시에 로그 정리, 일주일마다 주문 데이터 백업 같은 작업을 DB 안에서 자동화할 수 있다.


2. 스케줄러 활성화 및 확인 방법

MySQL 스케줄러는 기본적으로 꺼져 있을 수 있어, 먼저 활성화 여부를 확인하고 켜야 함

-- 현재 상태 확인
SHOW VARIABLES LIKE 'event_scheduler';

-- OFF일 경우 활성화
SET GLOBAL event_scheduler = ON;

SET GLOBAL은 서버 재시작 후에는 초기화되므로, 영구 적용은 설정 파일에 event_scheduler=ON을 추가해야 함.

현재 등록된 이벤트 목록은 다음 명령어로 확인할 수 있다.

SHOW EVENTS;
-- 또는
SELECT * FROM information_schema.EVENTS;

3. 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;

스케줄 표현식

  • AT: 특정 시각에 1회 실행
  • EVERY: 주기적으로 반복 실행
-- 특정 시각에 1회 실행
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR

-- 주기적 실행
ON SCHEDULE EVERY 1 DAY STARTS '2025-01-01 00:00:00'

4. 예시 코드

  • 예시 : 한 번만 실행되는 이벤트
CREATE EVENT myevent
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR 
DO
UPDATE myschema.mytable SET mycol = mycol + 1
  • 예시2: 매시간마다 실행되는 이벤트
CREATE EVENT e_hourly
ON SCHEDULE
EVERY 1 HOUR
COMMENT 'Clears out sessions table each hour.'
DO
DELETE FROM site_activity sessions;

4-1 실무에서 자주 쓰이는 패턴

  1. 오래된 로그 주기적으로 삭제
CREATE EVENT delete_old_logs
ON SCHEDULE EVERY 1 DAY
DO
DELETE FROM system_logs WHERE created_at < NOW() - INTERVAL 30 DAY;
  1. 주문 데이터 백업 및 정리
CREATE EVENT archive_orders
ON SCHEDULE EVERY 1 WEEK
DO
BEGIN
  INSERT INTO archive.orders SELECT * FROM orders WHERE status = 'completed';
  DELETE FROM orders WHERE status = 'completed';
END;
  1. 플래그 초기화 (매일 자정)
CREATE EVENT reset_user_flags
ON SCHEDULE EVERY 1 DAY STARTS '2025-01-01 00:00:00'
DO
UPDATE users SET daily_limit_used = 0;

5. 주의할 점과 심화 개념

1. 여러 쿼리 작성 시 DELIMITER 사용 필수

여러 쿼리를 포함하거나 BEGIN ... END 블록을 쓰려면 DELIMITER를 지정해야 한다.

DELIMITER $$ -- 앞으로는 $$로 명령 끝을 구분하겠다는 뜻

CREATE EVENT complex_event
ON SCHEDULE EVERY 1 HOUR
DO
BEGIN
    INSERT INTO logs (msg) VALUES ('Event triggered');
    UPDATE status SET value = 'done' WHERE id = 1;
END$$

DELIMITER ;  -- 다시 세미콜론으로 되돌림

2. ON COMPLETION [NOT] PRESERVE

  • NOT PRESERVE: 이벤트 1회 실행 후 자동 삭제 (기본값)
  • PRESERVE: 이벤트 실행 후에도 남아 있음

3. 상태 확인 및 제어

-- 이벤트 비활성화
ALTER EVENT event_name DISABLE;

-- 이벤트 활성화
ALTER EVENT event_name ENABLE;

-- 이벤트 삭제
DROP EVENT IF EXISTS event_name;

4. 이벤트 상태 확인

SELECT EVENT_NAME, LAST_EXECUTED, STATUS
FROM information_schema.EVENTS
WHERE EVENT_SCHEMA = 'your_db';

과제

특정 테이블의 Data를 가공하는 Event Scheduler 작성
✓ 1분 마다 데이터 등록하는 INSERT문이 실행되는 Scheduler 작성
✓ 현재 시각으로부터 5분 후 DLETE문이 실행되는 Scheduler 작성
✓ 특정 기간 동안 반복 실행되는 Scheduler 작성

과제 정답

  • 테이블 생성

use log;
CREATE TABLE simple_log (
    id INT AUTO_INCREMENT PRIMARY KEY,
    message VARCHAR(255),
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
  • 1 분 마다 데이터 삽입
CREATE EVENT insert_every_minute
ON SCHEDULE
    EVERY 1 MINUTE
DO  INSERT INTO simple_log (message) VALUES (CONCAT('Event executed at ', NOW()));
  • 5 분 뒤에 모든 데이터 삭제
CREATE EVENT delete_temp_data_once
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 5 MINUTE
ON COMPLETION NOT PRESERVE
DO
DELETE FROM simple_log;
  • 특정 기간 동안 실행하는 스케줄러
CREATE EVENT log_for_1_hour
ON SCHEDULE
    EVERY 5 MINUTE
    STARTS CURRENT_TIMESTAMP
    ENDS CURRENT_TIMESTAMP + INTERVAL 1 HOUR
DO  INSERT INTO simple_log (message) VALUES (CONCAT(' log_for_1_hour Event executed at ', NOW()));
profile
잘하자

0개의 댓글