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;