Как создавать запланированные события в MySQL

Ошибки в планировщике событий приводят к несвоевременной очистке логов и ошибкам в архивации данных. Руководство объясняет включение scheduler, синтаксис CREATE EVENT и методы управления расписанием на примерах типичных задач - очистка и архивация вне пикового времени.

Вы разберётесь, как создавать и отменять события MySQL для автоматического обслуживания. В результате сможете настроить событие для регулярной очистки или архивации и снять нагрузку с пиковых часов.

Конфигурация планировщика событий MySQL

Для выполнения всех запланированных событий MySQL использует специальный поток, который называется «поток планировщика событий».

Вы можете увидеть статус потока планировщика событий, выполнив следующую команду:

SHOW PROCESSLIST;
Конфигурация планировщика событий MySQL

По умолчанию поток планировщика событий отключен. Чтобы включить его и запустить поток планировщика событий, необходимо выполнить следующую команду:

SET GLOBAL event_scheduler = ON;

Теперь, чтобы увидеть статус потока планировщика событий, снова выполните команду SHOW PROCESSLIST:

Чтобы отключить и остановить поток планировщика событий, выполняется команда SET GLOBAL со значением для event_scheduler OFF:

SET GLOBAL event_scheduler = OFF;

Создание новых событий MySQL

Создание события производится аналогично созданию других объектов базы данных: таких как хранимые процедуры и триггеры.

Событие представляет собой проименованный объект, который содержит состояние SQL.

Хранимая процедура выполняется только при прямом вызове; триггер выполняется, когда происходит событие, связанное с таблицей: например добавление, обновление, или удаление. В то время как само событие может выполняться один или несколько раз с регулярным интервалом.

Чтобы создать и запланировать новое событие, нужно использовать оператор CREATE EVENT следующим образом:

CREATE EVENT [IF NOT EXIST]  event_name
ON SCHEDULE schedule
DO
event_body

Давайте рассмотрим этот оператор более подробно:

  • Во-первых, после CREATE EVENT необходимо указать имя события. Оно должно быть уникальным в структуре базы данных;
  • Во-вторых, после оператора ON SCHEDULE вы задаете график. Если событие является единичным, используется синтаксис: AT timestamp [+ INTERVAL]. Если событие периодическое, используется условие EVERY: EVERY interval STARTS timestamp [+INTERVAL] ENDS timestamp [+INTERVAL];
  • В-третьих, вы размещаете оператор SQL после ключевого слова DO. Стоит отметить, что вы можете вызвать хранимую процедуру внутри тела события. В случае если у вас есть составные операторы SQL, вы можете заключить их в блок BEGIN END.

Давайте рассмотрим несколько примеров создания события, которые позволят лучше понять приведенный выше синтаксис.

Чтобы создать и запланировать новое одноразовое событие, которое добавляет сообщение в таблицу сообщений, нужно сделать следующее:

Во-первых, нужно с помощью оператора CREATE TABLE создать новую таблицу с именем messages:

CREATE TABLE IF NOT EXISTS messages (
    id INT PRIMARY KEY AUTO_INCREMENT,
    message VARCHAR(255) NOT NULL,
    created_at DATETIME NOT NULL
);

Во-вторых, создаем событие с помощью оператора CREATE EVENT:

CREATE EVENT IF NOT EXISTS test_event_01
ON SCHEDULE AT CURRENT_TIMESTAMP
DO
  INSERT INTO messages(message,created_at)
  VALUES('Test MySQL Event 1',NOW());

В-третьих, проверяем таблицу messages. Вы увидите, что у нас есть одна запись. Это значит, что событие было выполнено во время его создания:

SELECT * FROM messages;
Создание новых событий MySQL

Для вывода всех событий базы данных, можно использовать следующий оператор:

SHOW EVENTS FROM classicmodels;

Мы видим, что нам не возвращается ни одна запись, потому что событие автоматически удаляется, когда истек его срок. В нашем случае это одноразовое событие, и его срок истек, когда его исполнение было завершено.

Чтобы изменить этот сценарий, вы можете использовать условие ON COMPLETION PRESERVE. Следующий оператор создает еще одно одиночное событие, которое выполняется спустя 1 минуту после его создания и не удаляется после выполнения:

CREATE EVENT test_event_02
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 MINUTE
ON COMPLETION PRESERVE
DO
   INSERT INTO messages(message,created_at)
   VALUES('Test MySQL Event 2',NOW());

Спустя 1 минуту проверяем таблицу сообщений, и видим, что в нее была добавлена еще одна запись:

SELECT * FROM messages;

Если мы снова запустим на исполнение оператор SHOW EVENTS, то увидим, что события все еще хранятся в структуре базы данных, потому что мы использовали условие ON COMPLETION PRESERVE:

SHOW EVENTS FROM classicmodels;

Следующий оператор создает повторяющееся событие, которое выполняется каждую минуту, и срок которого истекает спустя 1 час после времени его создания:

CREATE EVENT test_event_03
ON SCHEDULE EVERY 1 MINUTE
STARTS CURRENT_TIMESTAMP
ENDS CURRENT_TIMESTAMP + INTERVAL 1 HOUR
DO
  INSERT INTO messages(message,created_at)
   VALUES('Test MySQL recurring Event',NOW());

Обратите внимание, что мы использовали операторы STARTS и ENDS, чтобы задать для события срок действия. Вы можете протестировать это повторяющееся событие, подождав несколько минут, а затем вновь проверив таблицу сообщений:

SELECT * FROM messages;

Отмена событий MySQL

Чтобы отменить существующее событие, нужно использовать оператор DROP EVENT следующим образом:

DROP EVENT [IF EXIST] event_name;

Например, чтобы отменить событие test_event_03, нужно использовать следующий оператор:

DROP EVENT [IF EXIST] test_event_03;

Из этой статьи вы узнали о событиях MySQL, как создавать и удалять события из базы данных. В следующей статье мы покажем вам, как изменить существующее событие.

Комментарии

Оставьте свой комментарий
Дмитрий М.

DROP event - удалит событие. А именно задизаблить событие, не удаляя можно, если да, то как?

СН
Сергей Н.

Благодарю, доступно на примере! Но подскажите, кто в курсе, можно ли по events задать mysqldump таблицы?