Events sind geplante Aufgaben, die automatisch zu bestimmten Zeitpunkten ausgeführt werden. Sie sind vergleichbar mit Cron-Jobs in Unix-Systemen.
Ein Event wird mit CREATE EVENT erstellt:
-- Einfaches Event, das einmal ausgeführt wird
CREATE EVENT einmaliges_event
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR
DO
UPDATE statistik SET letzter_lauf = NOW();
-- Wiederholendes Event
CREATE EVENT tägliche_bereinigung
ON SCHEDULE EVERY 1 DAY
STARTS '2024-01-01 23:00:00'
DO
DELETE FROM temp_tabelle
WHERE datum < DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY);
-- Komplexeres Event mit mehreren Anweisungen
DELIMITER //
CREATE EVENT monatliche_abrechnung
ON SCHEDULE
EVERY 1 MONTH
STARTS '2024-01-01 00:00:00'
DO
BEGIN
-- Monatsstatistik erstellen
INSERT INTO monatsstatistik
SELECT
DATE_FORMAT(CURRENT_DATE, '%Y-%m') AS monat,
COUNT(*) AS anzahl_bestellungen,
SUM(betrag) AS gesamtumsatz
FROM bestellungen
WHERE DATE_FORMAT(datum, '%Y-%m') =
DATE_FORMAT(DATE_SUB(CURRENT_DATE, INTERVAL 1 MONTH), '%Y-%m');
-- Alte Protokolleinträge bereinigen
DELETE FROM protokoll
WHERE datum < DATE_SUB(CURRENT_DATE, INTERVAL 6 MONTH);
-- Statusaktualisierung
UPDATE system_status
SET letzter_monatslauf = NOW();
END //
DELIMITER ;Scheduling-Optionen:
AT für einmalige AusführungEVERY für wiederholende AusführungSTARTS für StartzeitENDS für Endzeit-- Verschiedene Scheduling-Beispiele
CREATE EVENT stündliches_event
ON SCHEDULE EVERY 1 HOUR;
CREATE EVENT arbeitstage_event
ON SCHEDULE EVERY 1 DAY
STARTS CURRENT_TIMESTAMP
ENDS CURRENT_TIMESTAMP + INTERVAL 1 YEAR
DO
-- Nur an Werktagen ausführen
IF DAYOFWEEK(CURRENT_DATE) BETWEEN 2 AND 6 THEN
-- Event-Logik
END IF;
CREATE EVENT quartal_event
ON SCHEDULE EVERY 1 QUARTER
STARTS '2024-01-01 00:00:00'
ENDS '2024-12-31 23:59:59';Events können gelöscht oder deaktiviert werden:
-- Event löschen
DROP EVENT einmaliges_event;
-- Sicherere Variante
DROP EVENT IF EXISTS einmaliges_event;
-- Event deaktivieren
ALTER EVENT tägliche_bereinigung
DISABLE;
-- Event wieder aktivieren
ALTER EVENT tägliche_bereinigung
ENABLE;
-- Event ändern
ALTER EVENT monatliche_abrechnung
ON SCHEDULE EVERY 1 MONTH
STARTS '2024-01-01 00:00:00'
DO
-- Neue Event-LogikPraktische Beispiele:
DELIMITER //
CREATE EVENT db_wartung
ON SCHEDULE EVERY 1 WEEK
DO
BEGIN
-- Temporäre Tabellen bereinigen
DELETE FROM temp_daten
WHERE erstellt < DATE_SUB(NOW(), INTERVAL 1 DAY);
-- Statistiken aktualisieren
ANALYZE TABLE wichtige_tabelle;
-- Protokollierung
INSERT INTO wartungsprotokoll
(zeitpunkt, aktion)
VALUES (NOW(), 'Wöchentliche Wartung durchgeführt');
END //
DELIMITER ;CREATE EVENT backup_erstellen
ON SCHEDULE EVERY 1 DAY
STARTS CURRENT_DATE + INTERVAL 23 HOUR
DO
-- Backup in separate Tabelle
INSERT INTO kunden_backup
SELECT *, CURRENT_TIMESTAMP as backup_datum
FROM kunden
ON DUPLICATE KEY UPDATE
email = VALUES(email),
telefon = VALUES(telefon),
backup_datum = CURRENT_TIMESTAMP;CREATE EVENT status_aktualisierung
ON SCHEDULE EVERY 5 MINUTE
DO
UPDATE bestellungen
SET status = 'überfällig'
WHERE status = 'offen'
AND datum < DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 24 HOUR);Tipps für Events:
DELIMITER //
CREATE EVENT sicheres_event
ON SCHEDULE EVERY 1 DAY
DO
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
INSERT INTO fehlerprotokoll
(zeitpunkt, ereignis, fehler)
VALUES (NOW(), 'sicheres_event', 'SQL-Fehler aufgetreten');
END;
-- Event-Logik
END //
DELIMITER ;-- Events anzeigen
SHOW EVENTS;
-- Event-Status prüfen
SELECT * FROM information_schema.EVENTS
WHERE EVENT_SCHEMA = 'meine_datenbank';
-- Eigene Überwachungstabelle
CREATE TABLE event_protokoll (
event_name VARCHAR(100),
letzter_lauf DATETIME,
status VARCHAR(50),
bemerkung TEXT
);-- Große Operationen aufteilen
CREATE EVENT große_bereinigung
ON SCHEDULE EVERY 1 HOUR
DO
DELETE FROM große_tabelle
WHERE datum < DATE_SUB(CURRENT_DATE, INTERVAL 1 YEAR)
LIMIT 1000;-- Event mit expliziter Zeitzone
CREATE EVENT zeitkritisches_event
ON SCHEDULE EVERY 1 DAY
STARTS '2024-01-01 00:00:00' + INTERVAL 1 HOUR
DO
-- Wird eine Stunde nach Mitternacht ausgeführt
-- unabhängig von der Systemzeitzone