MySQL의 Event Scheduler는 Cron
처럼 정기적으로 실행되는 쿼리 작업을 DB 레벨에서 자동으로 처리해주는 기능.
예를 들어: 매일 0시에 로그 정리, 일주일마다 주문 데이터 백업 같은 작업을 DB 안에서 자동화할 수 있다.
MySQL 스케줄러는 기본적으로 꺼져 있을 수 있어, 먼저 활성화 여부를 확인하고 켜야 함
-- 현재 상태 확인
SHOW VARIABLES LIKE 'event_scheduler';
-- OFF일 경우 활성화
SET GLOBAL event_scheduler = ON;
SET GLOBAL
은 서버 재시작 후에는 초기화되므로, 영구 적용은 설정 파일에event_scheduler=ON
을 추가해야 함.
현재 등록된 이벤트 목록은 다음 명령어로 확인할 수 있다.
SHOW EVENTS;
-- 또는
SELECT * FROM information_schema.EVENTS;
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'
CREATE EVENT myevent
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR
DO
UPDATE myschema.mytable SET mycol = mycol + 1
CREATE EVENT e_hourly
ON SCHEDULE
EVERY 1 HOUR
COMMENT 'Clears out sessions table each hour.'
DO
DELETE FROM site_activity sessions;
CREATE EVENT delete_old_logs
ON SCHEDULE EVERY 1 DAY
DO
DELETE FROM system_logs WHERE created_at < NOW() - INTERVAL 30 DAY;
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;
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;
여러 쿼리를 포함하거나 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 ; -- 다시 세미콜론으로 되돌림
NOT PRESERVE
: 이벤트 1회 실행 후 자동 삭제 (기본값)PRESERVE
: 이벤트 실행 후에도 남아 있음-- 이벤트 비활성화
ALTER EVENT event_name DISABLE;
-- 이벤트 활성화
ALTER EVENT event_name ENABLE;
-- 이벤트 삭제
DROP EVENT IF EXISTS event_name;
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
);
CREATE EVENT insert_every_minute
ON SCHEDULE
EVERY 1 MINUTE
DO INSERT INTO simple_log (message) VALUES (CONCAT('Event executed at ', NOW()));
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()));