수색…


이벤트 만들기

MySQL은 당신이 예정하고있는 것의 대부분이 SQL과 관련이 있고 파일 관련이 적을 때 복잡한 cron 상호 작용을 피하는 EVENT 기능을 가지고 있습니다. 매뉴얼 페이지를 참조 하십시오 . 일정을 반복 간격으로 실행되도록 예약 된 저장 프로 시저라고 생각하십시오.

이벤트 관련 문제를 디버깅하는 시간을 절약하려면 이벤트 처리를 위해 전역 이벤트 핸들러를 켜야합니다.

SHOW VARIABLES WHERE variable_name='event_scheduler';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| event_scheduler | OFF   |
+-----------------+-------+

끄면 아무것도 트리거되지 않습니다. 그래서 그것을 켜십시오 :

SET GLOBAL event_scheduler = ON;

테스트 용 스키마

create table theMessages
(   id INT AUTO_INCREMENT PRIMARY KEY,
    userId INT NOT NULL,
    message VARCHAR(255) NOT NULL,
    updateDt DATETIME NOT NULL,
    KEY(updateDt)
);
 
INSERT theMessages(userId,message,updateDt) VALUES (1,'message 123','2015-08-24 11:10:09');
INSERT theMessages(userId,message,updateDt) VALUES (7,'message 124','2015-08-29');
INSERT theMessages(userId,message,updateDt) VALUES (1,'message 125','2015-09-03 12:00:00');
INSERT theMessages(userId,message,updateDt) VALUES (1,'message 126','2015-09-03 14:00:00');

위의 삽입물은 출발점을 표시하기 위해 제공됩니다. 아래에 생성 된 2 개의 이벤트는 행을 지 웁니다.

2 이벤트, 매일 1 회 실행, 2 회 10 분마다 실행

그들이 실제로하고있는 것을 무시하십시오 (서로 대항하여). 요점은 INTERVAL과 일정에 있습니다.

DROP EVENT IF EXISTS `delete7DayOldMessages`;
DELIMITER $$
CREATE EVENT `delete7DayOldMessages`
  ON SCHEDULE EVERY 1 DAY STARTS '2015-09-01 00:00:00'
  ON COMPLETION PRESERVE
DO BEGIN
   DELETE FROM theMessages 
   WHERE datediff(now(),updateDt)>6; -- not terribly exact, yesterday but <24hrs is still 1 day
   
  -- Other code here

END$$
DELIMITER ;

...

DROP EVENT IF EXISTS `Every_10_Minutes_Cleanup`;
DELIMITER $$
CREATE EVENT `Every_10_Minutes_Cleanup`
  ON SCHEDULE EVERY 10 MINUTE STARTS '2015-09-01 00:00:00'
  ON COMPLETION PRESERVE
DO BEGIN
   DELETE FROM theMessages 
   WHERE TIMESTAMPDIFF(HOUR, updateDt, now())>168; -- messages over 1 week old (168 hours)

   -- Other code here
END$$
DELIMITER ;

이벤트 상태 표시 (다른 접근 방식)

SHOW EVENTS FROM my_db_name; -- List all events by schema name (db name)
SHOW EVENTS; 
SHOW EVENTS\G; -- <--------- I like this one from mysql> prompt

*************************** 1. row ***************************
                  Db: my_db_name
                Name: delete7DayOldMessages
             Definer: root@localhost
           Time zone: SYSTEM
                Type: RECURRING
          Execute at: NULL
      Interval value: 1
      Interval field: DAY
              Starts: 2015-09-01 00:00:00
                Ends: NULL
              Status: ENABLED
          Originator: 1
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
*************************** 2. row ***************************
                  Db: my_db_name
                Name: Every_10_Minutes_Cleanup
             Definer: root@localhost
           Time zone: SYSTEM
                Type: RECURRING
          Execute at: NULL
      Interval value: 10
      Interval field: MINUTE
              Starts: 2015-09-01 00:00:00
                Ends: NULL
              Status: ENABLED
          Originator: 1
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
2 rows in set (0.06 sec)

고려해야 할 무작위 재료

DROP EVENT someEventName; - 이벤트와 이벤트 코드를 삭제합니다.

ON COMPLETION PRESERVE - 이벤트가 처리 완료되면 유지하십시오. 그렇지 않으면 삭제됩니다.

이벤트는 트리거와 같습니다. 사용자 프로그램에 의해 호출되지 않습니다. 오히려 그들은 예정되어 있습니다. 따라서 그들은 조용히 성공하거나 실패합니다.

Manual Page에 대한 링크는 다음과 같이 간격 선택 사항이있는 매우 유연한 유연성을 보여줍니다.

간격:

quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
          WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
          DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}

이벤트는 시스템의 반복적 인 작업과 예약 된 작업을 처리하는 강력한 메커니즘입니다. 합리적으로 원하는만큼 많은 명령문, DDL 및 DML 루틴 및 복잡한 조인을 포함 할 수 있습니다. 저장된 매뉴얼 에 대한 제한 사항 이라는 MySQL 매뉴얼 페이지를 참조하십시오.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow