event_scheduler mysql 이건 어디에 써 먹는 걸까

mysql 8.0을 설치하고 shell로 접속해보니 새로운 녀석이 하나 있다

| 5 | event_scheduler | localhost | NULL | Daemon | 44 | Waiting on empty queue | NULL

event_scheduler ?? 라는 게 있는데

이게 뭔지 한번 알아보자!



[mysql@localhost ]$ mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.36 MySQL Community Server - GPL

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show processlist;
+----+-----------------+-----------+------+---------+------+------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-----------------+-----------+------+---------+------+------------------------+------------------+
| 5 | event_scheduler | localhost | NULL | Daemon | 44 | Waiting on empty queue | NULL |
| 9 | root | localhost | NULL | Query | 0 | init | show processlist |
+----+-----------------+-----------+------+---------+------+------------------------+------------------+
2 rows in set, 1 warning (0.01 sec)
mysql>

 

1. event_scheduler 란

MySQL Events는 스케줄에 따라 실행되는 Task입니다.

이벤트를 생성하면 지정된 시간 간격의 경과에 대한 응답으로 명령문(SQL)이 실행되는 개체가 생성됩니다.

개념적으로 이는 유닉스(리눅스) crontab 과 유사합니다.

시간을 지정해서 반복문 돌리는 스케줄러이구나..!


mysql> show global variables like 'event_sch%';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| event_scheduler | ON |
+-----------------+-------+
1 row in set (0.05 sec)

 

근데 이전에는 show processlist 에서 확인할 수 없었는데 언제부터 default가 on 으로 들어온 걸까?

#MySQL 8.0의 변경 사항 event_scheduler시스템 변수 의 기본값 OFF이 에서 으로 변경되었습니다

ON. 즉, 이벤트 스케줄러는 기본적으로 활성화되어 있습니다.

이는 “유휴 트랜잭션 종료”와 같은 SYS의 새로운 기능을 활성화하는 것입니다.

참조: https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html

-> mysql 8.0 으로 넘어가면서 default 값이 on으로 변경된 것을 알게 되었다.

2. event_scheduler 사용방법

1) 사용 (default)

SET GLOBAL event_scheduler = ON;

2) 중지

SET GLOBAL event_scheduler = OFF;

->전역변수로 global 영역에서 선언해야한다.


ex)
mysql> SET GLOBAL event_scheduler = OFF;
Query OK, 0 rows affected (0.00 sec)

mysql> show processlist;
+----+------+-----------+------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+------+---------+------+-------+------------------+
| 10 | root | localhost | NULL | Query | 0 | init | show processlist |
+----+------+-----------+------+---------+------+-------+------------------+
1 row in set, 1 warning (0.00 sec)

-> 스케줄러를 종료한 것을 show processlist; 확인함

 

3) 사용안함


vi /etc/my.cnf
---------------------------
event_scheduler=DISABLED

– 처음부터 사용하지 않겠다고 선언한 것으로 my.cnf 파일에서 DB 시작시에만 설정가능

– 한번 선언하면 이벤트 상태값을 다이나믹으로 on/off 불가

3. 활용처

지속적으로 쌓이는 temporary 데이터가 있을 때 해당 테이블을 자주 비워줌으로써 용량 차지가 되지 않게끔 해야 한다.

매번 개발자가 테이블을 비울 필요 없이 데이터베이스 자체에 어떤 이벤트를 걸어주고 주기적으로

반복되게끔 할 수 있는 것이 event scheduler이다 라고 하는데..

파티션을 삭제나 생성할 때 사용하면 좋을 것으로 보이는데 보통 대용량 데이터를 삭제하다 보니

lock이 걸리는 경우가 많아 새벽에 스케줄러를 돌린다고 하더라도 이걸 믿고 사용해도 될지 ..

테스트를 좀 해보고 적용해야 할 거 같다.


ex)
CREATE EVENT ip_reset
ON SCHEDULE EVERY 1 WEEK
-- STARTS '2021-06-23 02:09:00'
COMMENT 'ip 정보 삭제'
DO
TRUNCATE TABLE ip;

#이벤트 명령어 설명

CREAT EVENT : 이벤트명

ON SCHEDULE EVERY 반복주기 : MONTH, WEEK, DAY, HOUR 등 사용 가능

STARTS ‘시간’ : 해당 시간부터 시작, 시작시간 설정하지 않는 경우 이벤트 생성 후 다음 주기부터 실행

COMMENT ‘주석’

DO 동작 : 반복적으로 진행할 동작 입력

 

4. 이벤트 확인

show events;
또는
SELECT * FROM information_schema.events;

 

5. 이벤트 삭제

DROP event ip_reset;

Leave a Comment