Mysql ma swoją funkcjonalność EVENT, która pozwala uniknąć skomplikowanych interakcji z cron, gdy wiele z tego, co planujesz, jest związane z sql, a mniej z plikami. Zobacz stronę podręcznika tutaj . Mamy nadzieję, że poniższe informacje są krótkim przeglądem ważnych kroków i rzeczy do rozważenia, a także testowaniem weryfikowalnym.
show variables where variable_name='event_scheduler';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| event_scheduler | OFF |
+-----------------+-------+
Ups, harmonogram zdarzeń nie jest włączony. Nic się nie uruchomi.
SET GLOBAL event_scheduler = ON; -- turn her on and confirm below
show variables where variable_name='event_scheduler';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| 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)
-- FK's not shown
);
-- it is currently 2015-09-10 13:12:00
-- truncate table theMessages;
insert theMessages(userId,message,updateDt) values (1,'I need to go now, no followup questions','2015-08-24 11:10:09');
insert theMessages(userId,message,updateDt) values (7,'You always say that ... just hiding','2015-08-29');
insert theMessages(userId,message,updateDt) values (1,'7 day test1','2015-09-03 12:00:00');
insert theMessages(userId,message,updateDt) values (1,'7 day test2','2015-09-03 14:00:00');
Utwórz 2 wydarzenia, pierwsze przebiegi codziennie, drugie przebiegi co 10 minut
Zignoruj to, co faktycznie robią (grają przeciwko sobie). Chodzi o time difference
podejścia i planowanie .
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
-- etc etc all your stuff in here
END;$$
DELIMITER ;
...
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)
-- etc etc all your stuff in here
END;$$
DELIMITER ;
Pokaż statusy wydarzeń (różne podejścia)
show events from so_gibberish; -- list all events by schema name (db name)
show events; -- <--------- from workbench / sqlyog
show events\G;` -- <--------- I like this one from mysql> prompt
*************************** 1. row ***************************
Db: so_gibberish
Name: delete7DayOldMessages
Definer: [email protected]
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: so_gibberish
Name: Every_10_Minutes_Cleanup
Definer: [email protected]
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;
-- <----- warto o tym wiedzieć
nie można użyć aliasu datediff i użyć klauzuli where w 1 wierszu, więc
select id,DATEDIFF(now(),updateDt) from theMessages where datediff(now(),updateDt)>6;
dokładniej, 168 godzin za 1 tydzień
select id,TIMESTAMPDIFF(HOUR, updateDt, now()) as `difference` FROM theMessages;
+----+------------+
| id | difference |
+----+------------+
| 1 | 410 |
| 2 | 301 |
| 3 | 169 |
| 4 | 167 |
+----+------------+
Link do strony podręcznika pokazuje dużą elastyczność w wyborze interwałów, jak pokazano 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}
Współczesność
Osadź wszelkie środki współbieżności niezbędne, aby wielokrotne zdarzenia (lub wielokrotne uruchomienia tego samego zdarzenia) nie powodowały amoku danych.
Ustaw i zapomnij
Pamiętajcie na razie, bo zapomnicie o tym, że te wydarzenia po prostu strzelają. Zbuduj więc solidny kod, który będzie działał, nawet gdy zapomnisz. Które najprawdopodobniej zrobisz.
Twoje szczególne wymagania
Musisz określić, które wiersze należy najpierw usunąć według tabeli, tak aby uwzględniała ograniczenia dotyczące klucza podstawowego. Po prostu zrzuć je wszystkie w odpowiedniej kolejności w oczywistym obszarze za pomocą instrukcji CREATE EVENT, która może być ogromna.