Работа с запланированными событиями MySQL

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

Событие MySQL это задача, которая работает на основе заранее утвержденного расписания, поэтому иногда его еще называют запланированным событием. Событие MySQL также известно под названием «временной триггер», потому что оно вызывается в зависимости от времени, а не в зависимости от обновления таблицы, как триггер.

События MySQL похожи на хроны в UNIX или на планировщик задач в Windows.

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

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

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

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

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

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

SET GLOBAL event_scheduler = ON;

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

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

Чтобы отключить и остановить поток планировщика событий, выполняется команда 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;
Создание новых событий MySQL - 2

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

Чтобы изменить этот сценарий, вы можете использовать условие 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, как создавать и удалять события из базы данных. В следующей статье мы покажем вам, как изменить существующее событие.

Вадим Дворниковавтор-переводчик статьи «Working with MySQL Scheduled Event»