Suche…


Erstellen Sie ein Ereignis

Mysql verfügt über die EVENT-Funktion zum Vermeiden komplizierter Cron-Interaktionen, wenn ein Großteil Ihrer Zeitplanung auf SQL und weniger auf Dateien bezogen ist. Siehe die Handbuchseite hier . Stellen Sie sich Ereignisse als gespeicherte Prozeduren vor, deren Ausführung in regelmäßigen Abständen geplant ist.

Um beim Debuggen von ereignisbezogenen Problemen Zeit zu sparen, müssen Sie berücksichtigen, dass der globale Ereignishandler aktiviert sein muss, um Ereignisse zu verarbeiten.

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

Bei AUS wird nichts ausgelöst. Also einschalten:

SET GLOBAL event_scheduler = ON;

Schema zum Testen

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');

Die obigen Einsätze dienen als Ausgangspunkt. Beachten Sie, dass die unten erstellten 2 Ereignisse die Zeilen bereinigen.

Erstellen Sie 2 Ereignisse, 1. Läufe täglich, 2. Läufe alle 10 Minuten

Ignoriere, was sie tatsächlich tun (gegeneinander spielen). Der Punkt liegt auf dem INTERVAL und der Terminplanung.

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 ;

Ereignisstatus anzeigen (unterschiedliche Ansätze)

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)

Zufälliges Zeug zum Nachdenken

DROP EVENT someEventName; - Löscht das Ereignis und seinen Code

ON COMPLETION PRESERVE - Wenn das Ereignis abgeschlossen ist, behalten Sie es bei. Ansonsten wird es gelöscht.

Ereignisse sind wie Auslöser. Sie werden nicht von einem Benutzerprogramm aufgerufen. Sie sind vielmehr geplant. Als solche sind sie erfolgreich oder scheitern ohne Erfolg.

Der Link zur Manual Page zeigt einige Flexibilität mit Intervallauswahlmöglichkeiten (siehe unten):

Intervall:

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

Ereignisse sind leistungsfähige Mechanismen, mit denen wiederkehrende und geplante Aufgaben für Ihr System ausgeführt werden. Sie können beliebig viele Anweisungen, DDL- und DML-Routinen sowie komplizierte Verknüpfungen enthalten. Weitere Informationen finden Sie auf der MySQL-Handbuchseite unter Einschränkungen für gespeicherte Programme .



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow