Работа с запланированными событиями MySQL
Запланированные события в MySQL помогают автоматизировать повторяющиеся задачи и уменьшить нагрузку на базу данных. Они выполняются по расписанию и поддерживают систему в предсказуемом и стабильном состоянии.
Вы узнаете, как создавать события, настраивать их расписание и управлять выполнением задач. На примерах показано, как использовать события для оптимизации процессов, очистки данных и формирования отчетов, чтобы ваша база данных работала эффективно и без сбоев.
Конфигурация планировщика событий MySQL
Для выполнения всех запланированных событий MySQL использует специальный поток, который называется «поток планировщика событий».
Вы можете увидеть статус потока планировщика событий, выполнив следующую команду:
SHOW PROCESSLIST;
По умолчанию поток планировщика событий отключен. Чтобы включить его и запустить поток планировщика событий, необходимо выполнить следующую команду:
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;
Для вывода всех событий базы данных, можно использовать следующий оператор:
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 таблицы?