Event Scheduler - вбудований у MySQL планувальник: SQL-код виконується за розкладом прямо на сервері бази, без cron і без застосунку.
CREATE EVENT purge_old_sessions
ON SCHEDULE EVERY 1 HOUR
DO
DELETE FROM sessions WHERE last_activity < UNIX_TIMESTAMP() - 86400;
CREATE EVENT close_promo
ON SCHEDULE AT '2026-12-31 23:59:59'
DO
UPDATE promotions SET active = 0 WHERE code = 'NY2027';
SHOW EVENTS;
ALTER EVENT purge_old_sessions DISABLE;
У MySQL 8 планувальник увімкнено за замовчуванням (event_scheduler = ON), і в SHOW PROCESSLIST видно його окремий потік.
Що вміє: разові (AT) й періодичні (EVERY) події, час початку й завершення, автоматичне видалення одноразової події після виконання.
Чому в Laravel-застосунку зазвичай обирають планувальник Laravel:
| Event Scheduler | Планувальник Laravel | |
|---|---|---|
| де живе код | у базі, створюється SQL | у routes/console.php, у Git |
| що може робити | лише SQL | будь-який PHP: листи, черги, API, файли |
| тести | складно | звичайні тести Pest |
| видимість | SHOW EVENTS, легко забути |
php artisan schedule:list |
| моніторинг і помилки | помилки - у лозі помилок MySQL | логи застосунку, onFailure, сповіщення |
| кілька серверів | одна база - одне виконання | потрібен onOneServer() |
Типові пастки Event Scheduler:
- події не переносяться дампом за замовчуванням:
mysqldumpбез--eventsїх не зберігає - після відновлення з бекапу задачі мовчки зникають; - репліки: на репліці події, створені на джерелі, мають статус
REPLICA_SIDE_DISABLEDі не виконуються - інакше вони спрацювали б двічі. Після перемикання репліки на роль джерела їх треба ввімкнути вручну; - керовані бази: деякі хмарні сервіси вимикають планувальник або обмежують права на
EVENT; - невидимість: нова людина в команді не знає, що база щогодини щось видаляє.
Коли Event Scheduler доречний: суто базове обслуговування, яке має працювати незалежно від застосунку (очищення технічних таблиць, оновлення зведених таблиць), особливо коли базою користуються кілька застосунків.
Laravel-аналог для очищення старих записів - моделі з Prunable і Schedule::command('model:prune')->daily().