본문 바로가기
⚙️백엔드 : Backend/DataBase

SQL ) event_scheduler를 바로 등록시키는 방법

by 예옹이 2024. 8. 28.

 

1. 스케줄러 검사

먼저 이벤트 스케줄러의 쿼리 모양이 다음과 같은지 확인해줍니다.

예시코드)
매월 1일
objects테이블에 존재하는 물품의 이름과 가격을
objects_monthly테이블에 똑같이 입력해주는 스케줄러입니다.

CREATE EVENT IF NOT EXISTS insert_monthly_results
    ON SCHEDULE EVERY 1 MONTH
    STARTS '2024-08-01 00:00:00'
    DO
        INSERT INTO object_monthly (
            object_name,
            object_price,
            createdAt,
            updatedAt
        )
        SELECT
            objects.name,
            objects.price,
            NOW(),
            NOW()
        FROM
            objects
        WHERE
            objects.deletedAt IS NULL;

 

 

2. 동작 확인

스케줄러의 구조가 잡혔다면 쿼리문의 INSERT 부분이 제대로 동작하는지 확인해야합니다.

INSERT INTO object_monthly (
            object_name,
            object_price,
            createdAt,
            updatedAt
        )
        SELECT
            objects.name,
            objects.price,
            NOW(),
            NOW()
        FROM
            objects
        WHERE
            objects.deletedAt IS NULL;

스케줄러 부분에서 `INSERT INTO ... ` 부분만 따로 실행해봅니다.

이때 동작이 잘 된다면 데이터를 삽입하는 부분에는 문제가 없다는 뜻입니다.

기존 코드에서 CREATE EVENT 명령어로 이벤트를 생성했을 때는 이벤트가 미래의 특정 시간에 실행되도록 예약된 것이기에 바로 등록이 안되지만, 직접 INSERT INTO ... SELECT ... 쿼리를 실행했을 때는 즉시 데이터베이스에 삽입 명령이 실행되기 때문에 삽입이 원활하게 이루어지는 것입니다.

  • CREATE EVENT 명령어:
    • CREATE EVENT는 지정된 일정에 따라 쿼리가 실행되도록 예약합니다. 즉, 이벤트가 만들어졌다고 해서 바로 쿼리가 실행되는 것이 아닙니다. ON SCHEDULE EVERY 1 MONTH STARTS '2024-08-01 00:00:00' 구문에 의해, 2024년 8월 1일 00:00에 첫 실행이 예약되고 매달 1일에 실행되도록 설정된 것
    • 이벤트가 제대로 실행되려면 MariaDB 서버의 이벤트 스케줄러가 활성화되어 있어야 합니다. 이를 확인하고 설정하려면 다음과 같은 명령을 사용해야 합니다.
SET GLOBAL event_scheduler = ON;

 

  • INSERT INTO ... SELECT ... 쿼리:
    • 이 쿼리는 직접 실행하면 즉시 데이터를 삽입하는 명령어이고, 데이터베이스 서버는 이 명령을 받으면 지체 없이 해당 데이터를 삽입합니다.
    • 따라서, 즉시 레코드가 추가되는 것을 확인할 수 있습니다.

 

 

3. 스케줄러 즉시 실행을 위한 방법

ALTER EVENT insert_monthly_results
    ON SCHEDULE EVERY 1 MONTH
    STARTS CURRENT_TIMESTAMP + INTERVAL 1 MINUTE;

위의 코드를 실행해주면 됩니다.

그럼 스케줄러가 현재시간 1분 뒤에 실행되어 데이터가 잘 삽입하는것도 확인할 수 있습니다!

 

 

4. 스케줄러 실행 시작 시간의 기준

이벤트가 생성될 때, 시작 시간(STARTS)이 과거로 설정되어 있으면 이벤트는 처음 생성될 때 실행되는게  아니라 예약된 시간 이후의 다음 주기에 실행됩니다.

즉, 8월 1일로 설정되었더라도 8월 8일에 생성된 이벤트는 다음 달 1일에 처음 실행됩니다.