Поиск…


Создать мероприятие

У 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 на тему « Ограничения на сохраненные программы» .



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow