MySQL
Wydarzenia
Szukaj…
Utwórz wydarzenie
Mysql ma funkcję WYDARZENIA, która pozwala uniknąć skomplikowanych interakcji cron, gdy większość planowanych czynności jest związana z SQL, a mniej z plikami. Zobacz stronę Podręcznik tutaj . Pomyśl o zdarzeniach jako o procedurach przechowywanych, które mają być uruchamiane w cyklicznych odstępach czasu.
Aby zaoszczędzić czas podczas debugowania problemów związanych ze zdarzeniem, należy pamiętać, że globalna obsługa zdarzeń musi być włączona, aby przetwarzać zdarzenia.
SHOW VARIABLES WHERE variable_name='event_scheduler';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| event_scheduler | OFF |
+-----------------+-------+
Przy WYŁĄCZONYM nic się nie uruchomi. Więc włącz to:
SET GLOBAL event_scheduler = ON;
Schemat do testowania
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');
Powyższe wkładki służą do wskazania punktu początkowego. Pamiętaj, że 2 zdarzenia utworzone poniżej wyczyszczą wiersze.
Utwórz 2 wydarzenia, 1. biegi dziennie, 2. biegi co 10 minut
Zignoruj to, co faktycznie robią (granie przeciwko sobie). Chodzi o INTERWAŁ i planowanie.
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 ;
Pokaż statusy zdarzeń (różne podejścia)
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)
Losowe rzeczy do rozważenia
DROP EVENT someEventName;
- Usuwa zdarzenie i jego kod
ON COMPLETION PRESERVE
- Po zakończeniu przetwarzania zdarzenia zachowaj je. W przeciwnym razie zostanie usunięty.
Wydarzenia są jak wyzwalacze. Nie są wywoływane przez program użytkownika. Raczej są zaplanowane. Jako takie odnoszą sukcesy lub porażki po cichu.
Link do strony podręcznika pokazuje dość dużą elastyczność przy wyborze przedziałów, pokazanych poniżej:
interwał:
quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE | DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
Zdarzenia to potężne mechanizmy, które obsługują powtarzające się i zaplanowane zadania w systemie. Mogą zawierać dowolną liczbę instrukcji, procedur DDL i DML oraz skomplikowanych złączeń, jak możesz sobie życzyć. Zobacz stronę podręcznika MySQL zatytułowaną Ograniczenia dotyczące przechowywanych programów .