Violet Epifit

violet.su

Автоматизация задач в MariaDB: Планировщик событий (Event Scheduler)

Автоматизация задач в MariaDB: Планировщик событий (Event Scheduler)

Если вам нужно регулярно выполнять рутинные задачи в базе данных — чистить старые логи, архивировать записи, обновлять статистику — не обязательно писать PHP-скрипты и настраивать cron. В MariaDB есть встроенный планировщик событий (Event Scheduler), который работает прямо внутри СУБД.

Что такое Event Scheduler?

Это аналог cron, но встроенный непосредственно в MariaDB. Он позволяет создавать задачи (события), которые выполняются:

  • Однократно — в указанное время.
  • Периодически — каждые N минут/часов/дней/месяцев.
  • По расписанию — в конкретное время каждый день.

Преимущества перед cron + PHP

  1. Не зависит от веб-сервера — событие выполнится, даже если PHP не работает.
  2. Меньше нагрузки — не нужно запускать интерпретатор PHP.
  3. Проще код — чистый SQL без обвязки.
  4. Надёжнее — задача хранится в самой базе данных.
  5. Легко управлять — можно включить/выключить одним SQL-запросом.

Включение планировщика

По умолчанию планировщик может быть выключен. Проверяем статус:

SELECT @@event_scheduler;

Если результат OFF, включаем:

SET GLOBAL event_scheduler = ON;

Чтобы планировщик включался автоматически после перезагрузки сервера, добавьте в конфигурационный файл MariaDB (my.cnf или my.ini) в секцию [mysqld]:

event_scheduler = ON

Создание события: практический пример

Задача: Ежедневно в 3:00 утра удалять из таблицы звонков записи старше одного месяца.

CREATE EVENT ev_clean_old_calls
ON SCHEDULE
  EVERY 1 DAY
  STARTS (CURRENT_DATE + INTERVAL 1 DAY) + INTERVAL 3 HOUR
ON COMPLETION PRESERVE
COMMENT 'Ежедневная очистка звонков старше 1 месяца в 03:00'
DO
  DELETE FROM `uis-bitrix` 
  WHERE `CALL_DATE_TIME` < DATE_SUB(NOW(), INTERVAL 1 MONTH);

Разбор параметров:

  • EVERY 1 DAY — выполнять каждые сутки.
  • STARTS — дата и время первого запуска. (CURRENT_DATE + INTERVAL 1 DAY) — завтра, + INTERVAL 3 HOUR — в 3 часа ночи.
  • ON COMPLETION PRESERVE — сохранить событие после выполнения (не удалять).
  • COMMENT — описание для удобства.
  • DO — SQL-код, который выполняется.

Полезные примеры

1. Однократное выполнение (очистка кэша в полночь)

CREATE EVENT ev_clear_cache_once
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 DAY
DO
  TRUNCATE TABLE `cache_table`;

2. Каждые 6 часов (обновление статистики)

CREATE EVENT ev_update_stats
ON SCHEDULE EVERY 6 HOUR
STARTS CURRENT_TIMESTAMP
DO
  CALL update_statistics();

3. Каждое воскресенье в 2:00 (архивация)

CREATE EVENT ev_weekly_archive
ON SCHEDULE EVERY 1 WEEK
STARTS '2026-07-27 02:00:00'
DO
  INSERT INTO `archive_table` SELECT * FROM `main_table` WHERE updated < DATE_SUB(NOW(), INTERVAL 30 DAY);

Управление событиями

Просмотр всех событий

SHOW EVENTS;

Включить/выключить событие

-- Отключить
ALTER EVENT ev_clean_old_calls DISABLE;

-- Включить
ALTER EVENT ev_clean_old_calls ENABLE;

Изменить расписание

ALTER EVENT ev_clean_old_calls
ON SCHEDULE EVERY 2 DAY
STARTS '2026-07-25 04:00:00';

Удалить событие

DROP EVENT ev_clean_old_calls;

Важные нюансы

1. Часовой пояс

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

SELECT NOW();

2. Права доступа

Для создания событий нужна привилегия EVENT. Для управления чужими событиями — SUPER.

3. Ошибки в коде

Если в SQL-коде события есть ошибка, событие всё равно выполнится, но завершится с ошибкой. Ошибки пишутся в лог MariaDB.

4. Блокировки таблиц

Если событие выполняется долго, оно может блокировать таблицы. Для больших объёмов данных используйте удаление порциями:

-- Вместо одного DELETE на 100000 записей
DELETE FROM `big_table` WHERE date < DATE_SUB(NOW(), INTERVAL 30 DAY);

-- Лучше удалять по 1000 записей
DELETE FROM `big_table` WHERE date < DATE_SUB(NOW(), INTERVAL 30 DAY) LIMIT 1000;

5. Проверка работы

После создания события проверьте:

SHOW EVENTS WHERE Db = 'your_database';

Обратите внимание на колонки:

  • Status — должно быть ENABLED.
  • Starts — дата первого запуска.
  • Execute at — для однократных событий.

Заключение

Event Scheduler — мощный инструмент для автоматизации рутинных задач в MariaDB. Он проще cron, надёжнее PHP-скриптов и не требует дополнительных настроек сервера.

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


P.S. На моём проекте этот планировщик за одну ночь удалил 391 000 устаревших записей звонков, сократив таблицу с 515 000 до 124 000 строк. Теперь это происходит автоматически каждое утро в 3:00.