MySQL
События
Поиск…
Создать мероприятие
У Mysql есть свои функции EVENT, чтобы избежать сложных взаимодействий cron, когда большая часть того, что вы планируете, связана с SQL и меньше связана с файлами. См. Страницу руководства здесь . Подумайте о событиях как хранимых процедурах, которые планируется запустить с повторяющимися интервалами.
Чтобы сэкономить время при отладке связанных с событиями проблем, имейте в виду, что глобальный обработчик событий должен быть включен для обработки событий.
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 события, 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
- Когда мероприятие завершено, сохраните его. В противном случае он будет удален.
События похожи на триггеры. Они не вызываются программой пользователя. Скорее, они запланированы. Таким образом, они преуспевают или терпят неудачу молча.
Ссылка на страницу руководства показывает довольно много гибкости при выборе интервалов, показанных ниже:
интервал:
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 на тему « Ограничения на сохраненные программы» .