MySQL에서 이벤트(Event)는 기본적으로 만료되면 자동으로 삭제되기 때문에 SHOW EVENTS 문의 결과에서 더 이상 확인할 수 없습니다. 하지만 이벤트를 생성할 때 ON COMPLETION PRESERVE 절을 함께 사용하면, 이벤트가 실행을 마친 후에도 데이터베이스에 그대로 남아 있게 되어 나중에 조회하거나 재활용할 수 있습니다.
ON COMPLETION PRESERVE 없이 이벤트 생성하기
먼저 예제에 사용할 테이블을 생성합니다.
mysql> CREATE TABLE event_messages(ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT, MESSAGE VARCHAR(255) NOT NULL, Generated_at DATETIME NOT NULL); Query OK, 0 rows affected (0.61 sec)
아래 쿼리는 ON COMPLETION PRESERVE 절 없이 이벤트를 생성하는 예시입니다. 이렇게 만든 이벤트는 한 번 실행된 후 자동으로 삭제되므로, SHOW EVENTS FROM db_name 쿼리 결과에는 나타나지 않습니다.
mysql> CREATE EVENT testing_event_without_Preserves ON SCHEDULE AT CURRENT_TIMESTAMP DO INSERT INTO event_messages(message,generated_at) Values('Without Preserve',NOW());
Query OK, 0 rows affected (0.00 sec)
mysql> Select * from event_messages;
+----+------------------+---------------------+
| ID | MESSAGE | Generated_at |
+----+------------------+---------------------+
| 1 | Without Preserve | 2017-11-22 20:32:13 |
+----+------------------+---------------------+
1 row in set (0.00 sec)
mysql> SHOW EVENTS FROM query\G
*************************** 1. row ***************************
Db: query
Name: testing_event5
Definer: root@localhost
Time zone: SYSTEM
Type: ONE TIME
Execute at: 2017-11-22 17:09:11
Interval value: NULL
Interval field: NULL
Starts: NULL
Ends: NULL
Status: DISABLED
Originator: 0
character_set_client: cp850
collation_connection: cp850_general_ci
Database Collation: latin1_swedish_ci
1 row in set (0.00 sec)위 결과에서 볼 수 있듯이, PRESERVE 옵션 없이 생성된 이벤트는 실행이 완료된 후 목록에서 사라지거나 더 이상 유효하지 않게 됩니다.
ON COMPLETION PRESERVE를 사용하여 이벤트 생성하기
반면 아래 쿼리처럼 ON COMPLETION PRESERVE 절을 추가하면, 이벤트가 실행 완료된 후에도 삭제되지 않고 유지되어 SHOW EVENTS FROM db_name 쿼리 결과에서 계속 확인할 수 있습니다.
mysql> CREATE EVENT testing_event_with_Preserves ON SCHEDULE AT CURRENT_TIMESTAMP ON COMPLETION PRESERVE DO INSERT INTO event_messages(message,generated_at) Values('With Preserve',NOW());
Query OK, 0 rows affected (0.00 sec)
mysql> Select * from event_messages;
+----+------------------+---------------------+
| ID | MESSAGE | Generated_at |
+----+------------------+---------------------+
| 1 | Without Preserve | 2017-11-22 20:32:13 |
| 2 | With Preserve | 2017-11-22 20:35:12 |
+----+------------------+---------------------+
2 rows in set (0.00 sec)
mysql> SHOW EVENTS FROM query\G
*************************** 1. row ***************************
Db: query
Name: testing_event5
Definer: root@localhost
Time zone: SYSTEM
Type: ONE TIME
Execute at: 2017-11-22 17:09:11
Interval value: NULL
Interval field: NULL
Starts: NULL
Ends: NULL
Status: DISABLED
Originator: 0
character_set_client: cp850
collation_connection: cp850_general_ci
Database Collation: latin1_swedish_ci
*************************** 2. row ***************************
Db: query
Name: testing_event_with_Preserves
Definer: root@localhost
Time zone: SYSTEM
Type: ONE TIME
Execute at: 2017-11-22 20:35:12
Interval value: NULL
Interval field: NULL
Starts: NULL
Ends: NULL
Status: DISABLED
Originator: 0
character_set_client: cp850
collation_connection: cp850_general_ci
Database Collation: latin1_swedish_ci
2 rows in set (0.00 sec)결과를 비교해 보면, PRESERVE 옵션을 적용한 testing_event_with_Preserves 이벤트는 실행 후에도 이벤트 목록에 그대로 남아 있는 반면, 옵션이 없던 이벤트는 사라진 것을 확인할 수 있습니다.
정리
ON COMPLETION PRESERVE는 일회성(ONE TIME) 이벤트가 실행을 마친 뒤에도 자동 삭제를 방지하고 싶을 때 유용한 옵션입니다. 다만, 불필요하게 오래 유지된 이벤트가 데이터베이스에 누적될 수 있으므로, 더 이상 필요하지 않은 이벤트는 DROP EVENT 문으로 직접 정리해 주는 것이 좋습니다.