Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
Tags
- wrapper class
- procedure
- 프로그래머스
- BIT연산
- Parquet
- 우선순위큐
- S3
- priorityqueue
- namenode
- ACID
- SQL
- MySQL
- JPA
- database
- bigdata
- greedy
- boto3
- 시뮬레이션
- Spring
- ES6
- 구현
- 백준
- Transaction
- EventScheduler
- BFS
- Algorithm
- datanode
- hdfs
- spark
- MVC
Archives
- Today
- Total
IT 개발일지
[MySQL] MySQL Event Scheduler 본문
Event Scheduler
정의
- DB내에서 스케줄링이나, 특정 스케줄에 맞춘 이벤트를 실행할 때 사용한다.
- Unix의 crontab이나 Windows의 Task Scheduler와 비슷하다.
- Trigger과 혼동할 수 있는데, Trigger은 특정 SQL statement가 지정된 테이블의 데이터를 변화시킬 때 자동으로 발현하는 것이고, event는 미리 정해진 시간에 따라 interval하게 진행된다는 차이가 있다.
사용하는 이유
1. 주기적, 또는 특정 시간에 작업이 필요한 경우에 자동으로 처리할 수 있다.
- 주기적으로 발생하는 작업을 수작업으로 할 필요없이 자동화할 수 있다.
- 정기적인 데이터 백업
- 시간의 흐름에 따른 데이터 변경
2. 실시간 처리 시 DB에 과부하가 걸리는 작업을 스케줄링할 수 있다.
- 통계 등의 Batch 작업
- Ranking Data
형식
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}
Scheduler 생성 전 확인 사항
Event Scheduler 사용 여부 확인
-- Event Scheduler 사용 여부 확인
SHOW VARIABLES LIKE 'event%';
-- 만약 Value가 OFF이면 ON으로 바꿈
SET GLOBAL event_scheduler = ON;
-- 현재 MySQL 내에 저장된 Event Scheduler가 있는지 확인
SHOW EVENTS;
SELECT * FROM information_schema.EVENTS;
실습
1. 1분 간격으로 특정 dummy 데이터를 생성하는 Scheduler를 만들기
Event를 위한 Table 생성
CREATE TABLE event_test (
id INT NOT NULL AUTO_INCREMENT,
data VARCHAR(10) NOT NULL,
time DATETIME NOT NULL,
PRIMARY KEY (id)
);
Event 생성
-- 이벤트 생성
CREATE EVENT test_1sec
ON SCHEDULE
EVERY 1 MINUTE -- 매 분마다
COMMENT 'Insert Data every 1 minute' -- comment
DO
INSERT INTO event_test (data, time) VALUES ('example1', NOW()); -- 실행항 구문 작성
1분마다 데이터가 추가되는 것이 보인다.
Event 수정
- CREATE 문 대신 ALTER로 바꾸면 된다.
-- ALTER문을 활용해서 바꾸면 된다.
ALTER EVENT test_1sec
ON SCHEDULE
EVERY 2 MINUTE
COMMENT 'Insert Data every 2 minute'
DO
INSERT INTO event_test (data, time) VALUES ('example1', NOW());
Event 삭제
- DROP문을 활용하면 된다.
DROP EVENT test_1sec;
2. 현재 시각으로부터 5분 후 모든 데이터를 삭제하는 Event Scheduler을 만들어보자
Table 생성
CREATE TABLE event_test2 (
id INT NOT NULL AUTO_INCREMENT,
data VARCHAR(10) NOT NULL,
PRIMARY KEY (id)
);
Event 생성
- 이때, AT CURRENT_TIMESTAMP, INTERVAL을 활용하여 지금 시간으로부터 5분 뒤에 실행하도록 하고 있다.
-- 이벤트 생성
CREATE EVENT test_delete_after_5_minutes
ON SCHEDULE
AT CURRENT_TIMESTAMP + INTERVAL 5 MINUTE
COMMENT 'DELETE id = 1 data after 5 minutes'
DO
DELETE FROM event_test_2 WHERE id = 1;
3. 이벤트 실행 시점으로부터 5분간만 1분에 1개씩 데이터를 추가하도록 하기.
Table 생성
CREATE TABLE event_test3 (
id INT NOT NULL AUTO_INCREMENT,
data VARCHAR(10) NOT NULL,
time DATETIME NOT NULL,
PRIMARY KEY (id)
);
- Event 생성
- STARTS, ENDS 문을 활용하여 언제부터 언제까지만 실행될지 정할 수 있다.
CREATE EVENT test_interval_1min
ON SCHEDULE
EVERY 1 MINUTE
STARTS CURRENT_TIMESTAMP
ENDS CURRENT_TIMESTAMP + INTERVAL 5 MINUTE
COMMENT 'Insert Data every 1 minute during 5 minutes'
DO
INSERT INTO event_test3 (data, time) VALUES ('example1', NOW());