MySql 에서 schedule 처리 하기

2024. 4. 15. 00:00ASPNET/WebApi

반응형

특정 작업을 하다 보면 db 에 data 를 일정 시간마다 update 하는 경우가 생긴다. 

일반적으로 back up 같은 경우가 그렇고

daily 마다 reset 하는 table 들도 있을 수 있다. 

 

이런경우 mysql 은 event 를 이용해 처리 한다. 

 

아래 구문은 매 1분 마다 table 을 truncate 하는 구문이다. 

CREATE EVENT daily_truncate
ON SCHEDULE
    EVERY 1 MINUTE
    STARTS CURRENT_TIMESTAMP
ON COMPLETION PRESERVE
DO
    BEGIN
        TRUNCATE TABLE your_table_name;
    END;

 

문제는 mysql 은 rdbms 이고 관계형 db 는 필연적으로 foreign key 를 갖게된다. 

그러다 보니 특정 table 을 비울때 오류가 날 수 있다. 

 

그래서 다음과 같은 구문을 추가해서 처리 한다. 

(주의 : 이 구문은 자신이 비우려는 table 과 연계된 table 도 다시 지울 거라는 가정에 해야한다.)

 

CREATE EVENT daily_truncate
ON SCHEDULE
    EVERY 1 MINUTE
    STARTS CURRENT_TIMESTAMP
ON COMPLETION PRESERVE
DO
    BEGIN
    	SET FOREIGN_KEY_CHECKS = 0;
        TRUNCATE TABLE your_table_name;
        SET FOREIGN_KEY_CHECKS = 1;
    END;

**외래 키 제약 조건을 해제할 경우 데이터 무결성이 보장되지 않을 수 있으므로,

이러한 조치를 취하기 전에 주의깊게 검토해야 한다.**

 

 

 

자 이제 이 구문을 ef core 에서 실행해보자

 

이전에 우리는 quartz 를 이용해 특정시간 마다 insert 하는 app 을 작성했다. 

https://yogingang.tistory.com/481

 

Quartz 를 이용한 schedule job 처리

프로그래밍을 하다보면 일정시간에 정기적으로 실행되야 하는 process 가 존재한다. 이런 process 를 처리할때 여러가지 방법이 있다. 1. OS 에 특정 기능(scheduler, crontab 등등)을 이용한다. 2. language 의

yogingang.tistory.com

이제 이 app 에  mysql 의  event 를 이용해 일정시간마다 truncate table 하는 scheduler 를 작성해 보자

 

EF Core 에서 직접 sql 구문을 실행 하게 하고 

mysql 에 이미 event 가 있는지 확인 한 후 없으면 event 를 생성하게 하자

//일단 event 생성 구문 부터 if not exist 를 적용해 보자
CREATE EVENT IF NOT EXISTS daily_truncate
ON SCHEDULE
    EVERY 1 MINUTE
    STARTS CURRENT_TIMESTAMP
ON COMPLETION PRESERVE
DO
    BEGIN
    	SET FOREIGN_KEY_CHECKS = 0;
        TRUNCATE TABLE your_table_name;
        SET FOREIGN_KEY_CHECKS = 1;
    END;

 

이제 이 구문을 ef core 에서 실행해 보자

var sql = @"
    USE `efcore-test`;
    CREATE EVENT IF NOT EXISTS daily_truncate
    ON SCHEDULE
        EVERY 1 MINUTE
        STARTS CURRENT_TIMESTAMP
    ON COMPLETION PRESERVE
    DO
    BEGIN
        TRUNCATE TABLE Users;
    END;
";

await Database.ExecuteSqlRawAsync(sql);

 

위와 같이 만든후 실행 하면 된다. 

 

web api 같은 경우 program.cs 에서 app run 이전에 실행하자

 

await RegisterMySqlEventScheduler(app);

app.Run();


static async Task RegisterMySqlEventScheduler(WebApplication app)
{
    using var scope = app.Services.CreateScope();
    
    var dbContext = scope.ServiceProvider.GetRequiredService<BaseDbContext>();
    await dbContext.CreateEventAsync();
}

 

이제 10초에 한번씩 data 가 생성되고

1분에 한번씩 data 를 삭제할 것이다.

 

 

 

관련영상

https://youtu.be/mbXB2GCytNQ

반응형