오라클의 job과 유사한 기능을 지원하는 Mysql DB에는 scheduled Event기능이 있습니다.
MySQL 이벤트 스케줄러 및 데이터베이스 작업을 자동화하는 방법에 대해서 기술하겠습니다.
MySQL 이벤트는 미리 정의 된 일정에 따라 실행되는 작업이므로 예약 된 이벤트라고도합니다. MySQL 이벤트는 트리거와 같은 테이블 업데이트가 아니라 시간에 따라 트리거되므로 "temporal trigger"라고도 합니다 . MySQL 이벤트는 UNIX의 cron 작업 또는 Windows의 작업 스케줄러와 유사합니다.
데이터베이스 테이블 최적화, 로그 정리, 데이터 보관 또는 사용량이 적은 시간 동안 복잡한 보고서 생성과 같은 많은 경우에 MySQL 이벤트를 사용할 수 있습니다.
MySQL 이벤트 스케줄러 구성
MySQL은 이벤트 일정 스레드라는 특수 스레드를 사용하여 모든 예약 이벤트를 실행합니다. 다음 명령을 실행하여 이벤트 스케줄러 스레드의 상태를 볼 수 있습니다.
SHOW PROCESSLIST;
기본적으로 이벤트 스케줄러 스레드는 사용되지 않습니다. 이벤트 스케줄러 스레드를 활성화하고 시작하려면 다음 명령을 실행해야합니다.
사용
SET GLOBAL event_scheduler = ON;
사용불가
SET GLOBAL event_scheduler = OFF;
현재값 조회
show variables;
새 이벤트를 작성하고 스케줄하려면 CREATE EVENT다음과 같이 명령문 을 사용하십시오 .
CREATE EVENT [IF NOT EXIST] event_name
ON SCHEDULE schedule
DO
event_body
자세히 살펴 봅시다.
- 먼저, CREATE EVENT절 뒤에 이벤트 이름을 지정하십시오 . 이벤트 이름은 데이터베이스 스키마 내에서 고유해야합니다.
- 둘째, ON SCHEDULE절 뒤에 일정을 넣습니다 . 이벤트가 일회성 이벤트 인 경우 다음 구문을 사용하십시오. AT timestamp [+ INTERVAL]이벤트가 되풀이되는 이벤트 인 경우 다음 EVERY절 을 사용하십시오 .EVERY interval STARTS timestamp [+INTERVAL] ENDS timestamp [+INTERVAL]
- 셋째, DO키워드 뒤에 SQL 문을 배치합니다 . 이벤트 본문 내에서 저장 프로 시저를 호출 할 수 있습니다. 복합 SQL 문이 있으면 BEGIN END블록으로 랩핑 할 수 있습니다 .
위의 구문을 이해하기 위해 이벤트를 작성하는 몇 가지 예를 살펴 보겠습니다.
먼저 다음과 같이 명령문을 messages사용하여 이름이 지정된 새 테이블을 작성하십시오 CREATE TABLE
CREATE TABLE IF NOT EXISTS messages (
id INT PRIMARY KEY AUTO_INCREMENT,
message VARCHAR(255) NOT NULL,
created_at DATETIME NOT NULL
);
둘째, 다음 CREATE EVENT명령문 을 사용하여 이벤트를 작성하십시오.
CREATE EVENT IF NOT EXISTS test_event_01
ON SCHEDULE AT CURRENT_TIMESTAMP
DO
INSERT INTO messages(message,created_at)
VALUES('Test MySQL Event 1',NOW());
셋째, messages테이블을 확인하십시오 . 우리는 하나의 기록을 가지고 있음을 알 수 있습니다. 이벤트가 작성 될 때 실행되었음을 의미합니다.
SELECT * FROM messages;
데이터베이스 스키마의 모든 이벤트를 표시하려면 다음 명령문을 사용하십시오.
SHOW EVENTS FROM '스미키명';
결과 없음
이벤트가 만료되면 자동으로 삭제되므로 행이 반환되지 않습니다. 우리의 경우, 이것은 일회성 이벤트이며 실행이 완료되면 만료됩니다.
이 동작을 변경하기 위해 ON COMPLETION PRESERVE절을 사용할 수 있습니다 . 다음 명령문은 작성 시간 1 분 후에 실행되고 실행 후에 삭제되지 않는 다른 일회성 이벤트를 작성합니다.
CREATE EVENT test_event_02
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 MINUTE
ON COMPLETION PRESERVE
DO
INSERT INTO messages(message,created_at)
VALUES('Test MySQL Event 2',NOW());
1 분 동안 기다렸다가 메시지 테이블을 확인하십시오. 다른 레코드가 추가되었습니다.
SHOW EVENTS명령문을 다시 실행 하면 ON COMPLETION PRESERVE절의 효과로 인해 이벤트가있는 것을 볼 수 있습니다.
SHOW EVENTS FROM '스미키명';
다음 명령문은 1 분마다 실행되는 반복 이벤트를 작성하며 작성 시간으로부터 1 시간 후에 만료됩니다.
CREATE EVENT test_event_03
ON SCHEDULE EVERY 1 MINUTE
STARTS CURRENT_TIMESTAMP
ENDS CURRENT_TIMESTAMP + INTERVAL 1 HOUR
DO
INSERT INTO messages(message,created_at)
VALUES('Test MySQL recurring Event',NOW());
이벤트의 만료 기간을 정의하기 위해 STARTS및 ENDS절을 사용했습니다. 몇 분 정도 기다렸다가 messages테이블을 확인하여이 되풀이 이벤트를 테스트 할 수 있습니다 .
SELECT * FROM messages;
MySQL 이벤트 삭제
기존 이벤트를 제거하려면 DROP EVENT다음과 같이 명령문 을 사용하십시오
ROP EVENT [IF EXIST] event_name;
예를 들어, test_event_03이벤트 를 삭제 하려면 다음 명령문을 사용하십시오.
DROP EVENT [IF EXIST] test_event_03;
MySQL을 사용하면 기존 이벤트의 다양한 속성을 변경할 수 있습니다. 기존 이벤트를 변경하려면 ALTER EVENT다음과 같이 명령문 을 사용하십시오 .
ALTER EVENT event_name
ON SCHEDULE schedule
ON COMPLETION [NOT] PRESERVE
RENAME TO new_event_name
ENABLE | DISABLE
DO
event_body
ALTER EVENT문은 기존 이벤트에 적용됩니다. 존재하지 않는 이벤트를 수정하려고하면 MySQL은 오류 메시지를 발행하므로 SHOW EVENTS이벤트를 변경하기 전에 항상 명령문을 사용 하여 이벤트가 있는지 점검 해야 합니다.
SHOW EVENTS FROM '스키마명;
이벤트 변경 예
ALTER EVENT명령문의 다양한 기능을 보여주기 위해 샘플 이벤트를 작성해 봅시다 .
다음 명령문은 messages테이블에 1 분마다 새 레코드를 삽입하는 이벤트를 작성 합니다.
CREATE EVENT test_event_04
ON SCHEDULE EVERY 1 MINUTE
DO
INSERT INTO messages(message,created_at)
VALUES('Test ALTER EVENT statement',NOW());
일정 변경
2 분마다 이벤트를 실행하려면 다음 명령문을 사용하십시오.
ALTER EVENT test_event_04
ON SCHEDULE EVERY 2 MINUTE;
이벤트 본문 변경
다음과 같이 새 논리를 지정하여 이벤트 본문을 변경할 수도 있습니다.
ALTER EVENT test_event_04
DO
INSERT INTO messages(message,created_at)
VALUES('Message from event',NOW());
2 분 동안 기다렸다가 messages테이블을 다시 확인할 수 있습니다 .
이벤트 비활성화
이벤트를 사용하지 않으려면 다음 명령문을 사용하십시오.
ALTER EVENT test_event_04 DISABLE; |
SHOW EVENTS다음과 같은 명령문을 사용하여 이벤트 상태를 확인할 수 있습니다 .
SHOW EVENTS FROM '스키마명';
이벤트 사용
비활성화 된 이벤트를 활성화하려면 다음과 같이 명령문 다음에 ENABLE키워드 를 사용하십시오 ALTER EVENT.
ALTER EVENT test_event_04
ENABLE;
이벤트 이름 바꾸기
MySQL은 RENAME EVENT진술을 제공하지 않습니다 . 다행히를 사용하여 ALTER EVENT다음과 같이 기존 이벤트의 이름을 바꿀 수 있습니다 .
ALTER EVENT test_event_04
RENAME TO test_event_05;
다른 데이터베이스로 이벤트 이동
RENAME TO다음과 같은 절을 사용하여 데이터베이스에서 다른 데이터베이스로 이벤트를 이동할 수 있습니다
ALTER EVENT '스키마명'.test_event_05
RENAME TO 'newdb'.test_event_05
newdb데이터베이스가 MySQL 데이터베이스 서버에서 사용 가능한 것으로 가정 합니다.
이 학습서에서는 ALTER EVENT명령문 을 사용하여 MySQL 이벤트의 다양한 속성을 변경하는 방법을 보여주었습니다.
http://www.mysqltutorial.org/mysql-triggers/modifying-mysql-events/
'DB > mysql' 카테고리의 다른 글
insert into on duplicate 있을 경우 update 없을 경우 insert (0) | 2023.04.27 |
---|