주기적으로 서버에서 어떤 작업을 해야할 때, 서버에서는 Cron / Batch / Event 등을 통하여 주기적인 작업을 진행한다.


DB에서도 주기적으로 작업을 해줘야 하는 것이 있다.

대표적인 것으로는 특정 Event에 따라 별도의 테이블에 데이터를 자동적으로 이관한다거나, 자동으로 데이터 백업을 해야 하는 것 등이 있을 것이다.

Trigger과 같은 기능을 사용해도 유사한 기능을 수행할 수 있으나, Trigger는 어떠한 이벤트가 발생했을 때 사용되는 것이기 때문에, 주기적인 작업에는 적합하지 않다고 볼 수 있다.


또한, DB를 사용하는 서버(Application)에서 주기적으로 쿼리를 DB로 요청할 수도 있다.

하지만 이 경우에는 Application이 비정상 작동 또는 장애가 발생했을 경우가 있을 수 있으므로, 장애 포인트가 하나 늘어난다고 볼 수 있다.

(물론 과거에 MySQL, MariaDB의 Event Scheduler의 성능이 떨어진다는 이야기도 있었으나, 최근에는 많이 개선되었다고 하고, 시스템별로 느슨한 연결을 하기 위하여 DB의 Event Scheduler 사용도 필요하다.)



Event Scheduler 사용 설정

우선, MariaDB에서 별도로 설정하지 않았다면, Event 옵션은 Off 상태이다.

이를 활성화시키기 위해서 두가지 방법 중 하나를 선택하면 된다.


1. Option 변경

1
2
3
4
5
-- MariaDB event scheduler 활성화
SET GLOBAL event_scheduler = ON;
SET @@global.event_scheduler = ON;
SET GLOBAL event_scheduler = 1;
SET @@global.event_scheduler = 1;


2. my.ini  (Linux에서는 my.cnf ) 에 설정 추가


  event_scheduler = ON  


*1번의 경우에는 Event Scheduler 사용을 위해 재시작이 필요없지만, 다음 재시작 때에는 Event Scheduler가 설정값을 따른다 (기본은 Off)

*2번의 경우에는 재시작을 해야만 설정에 추가되며, 한번 재시작 하고 난 다음에는 시작마다 설정이 On 되어 있다.



Event Scheduler 설정 확인

1
2
-- Event 변수 확인
show variables like 'event%';


Event Scheduler 등록

Event Scheduler 등록하는 쿼리이다.
동작 주기는 Month, Hour, Minute, Second 등으로 다양하다.
너무 자주 동작하면 DB 성능에 무리가 갈 수도 있으나, 또 너무 긴 기간으로 설정하면 한번의 쿼리에 많은 시간이 필요한 Trade-Off가 있을 수 있다.
아래 Event에서는 SP를 호출하도록 했다.
(Raw 쿼리문을 입력하는 것보다, SP를 호출하게 하는 것이 유지보수상으로 더 좋다)


1
2
3
4
5
6
7
-- Event 생성
CREATE EVENT IF NOT EXISTS EV_BACKUP_TABLE
    ON SCHEDULE
        EVERY 1 MINUTE -- Event 실행 주기
        STARTS ' 2016-12-08 10:00:00' -- Event 최초 시작 시간
    DO
        CALL SP_BACKUP_TABLE_CREATE(); -- Event에서 수행할 명령어



Event Scheduler 관리

1
2
3
4
5
6
-- Event 목록 확인
SHOW EVENTS ;
SELECT * FROM INFORMATION_SCHEMA.EVENTS;
 
-- Event 삭제
drop event     EV_BACKUP_TABLE;



출처: http://fernweh6990.tistory.com/150 [KnockKnock]