Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 TTL(Time To Live) 옵션으로 레코드를 자동 관리하는 방법

MySQL에서 TTL(Time To Live) 개념처럼 유효 기간이 지난 레코드를 자동으로 정리하려면 이벤트 스케줄러(Event Scheduler)를 활용하는 것이 가장 효과적입니다. 이벤트 스케줄러는 SQL 작업의 실행을 주기적으로 예약하고 관리해 주는 MySQL 내장 기능으로, 별도의 외부 스크립트 없이도 데이터베이스 차원에서 만료된 데이터를 손쉽게 삭제할 수 있습니다.

먼저 테스트용 테이블을 생성한 뒤, 매일 한 번씩 자동으로 실행되는 이벤트를 등록하는 순서로 진행하겠습니다.

1단계: 테이블 생성하기

예제에 사용할 테이블을 먼저 만듭니다. 아래 쿼리는 고유 ID와 이벤트 날짜·시간을 저장하는 간단한 구조입니다.

mysql> create table EventDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> EventDateTime datetime
-> );
Query OK, 0 rows affected (0.71 sec)

2단계: 샘플 데이터 삽입하기

INSERT 문을 사용해 여러 날짜의 레코드를 입력합니다. 일부러 과거 날짜와 최근 날짜를 섞어 넣으면 TTL 동작을 확인하기 좋습니다.

mysql> insert into EventDemo(EventDateTime) values('2010-09-21');
Query OK, 1 row affected (0.19 sec)
mysql> insert into EventDemo(EventDateTime) values('2016-10-27');
Query OK, 1 row affected (0.20 sec)
mysql> insert into EventDemo(EventDateTime) values('2018-12-09');
Query OK, 1 row affected (0.10 sec)
mysql> insert into EventDemo(EventDateTime) values('2019-03-12');
Query OK, 1 row affected (0.17 sec)
mysql> insert into EventDemo(EventDateTime) values('2019-01-04');
Query OK, 1 row affected (0.15 sec)

3단계: 저장된 데이터 확인하기

SELECT 문으로 테이블에 들어 있는 모든 레코드를 조회합니다.

mysql> select *from EventDemo;

실행 결과는 다음과 같습니다.

+----+---------------------+
| Id | EventDateTime |
+----+---------------------+
| 1 | 2010-09-21 00:00:00 |
| 2 | 2016-10-27 00:00:00 |
| 3 | 2018-12-09 00:00:00 |
| 4 | 2019-03-12 00:00:00 |
| 5 | 2019-01-04 00:00:00 |
+----+---------------------+
5 rows in set (0.00 sec)

4단계: TTL 기반 자동 삭제 이벤트 생성하기

이제 핵심 단계입니다. 아래 쿼리는 하루에 한 번 실행되며, 현재 시각(NOW())보다 이전인 EventDateTime 값을 가진 레코드를 모두 삭제합니다. 즉, 유효 기간이 지난 데이터가 자동으로 정리되는 TTL 방식의 처리 로직입니다.

mysql> delimiter //
mysql> CREATE EVENT
-> DeleteDemo
-> ON SCHEDULE EVERY 1 DAY
-> DO
-> BEGIN
-> DELETE FROM
-> EventDemo
-> WHERE EventDateTime < NOW();
-> END //
Query OK, 0 rows affected (0.31 sec)

참고: 이벤트 스케줄러 활성화 확인

이벤트가 실제로 동작하려면 서버에서 이벤트 스케줄러가 켜져 있어야 합니다. 아래 명령으로 상태를 확인하고, 꺼져 있다면 활성화할 수 있습니다.

mysql> SHOW VARIABLES LIKE 'event_scheduler';
mysql> SET GLOBAL event_scheduler = ON;

이렇게 구성하면 별도의 배치 작업 없이도 MySQL이 스스로 만료된 레코드를 매일 정리하므로, 세션 데이터나 임시 로그처럼 보관 기간이 정해진 데이터를 운영할 때 매우 유용합니다.