MySQL Events Scheduler
MySQL Event Scheduler क्या है?
Event Scheduler specified time/interval पर SQL चलाने की MySQL server-side facility है। Event named schema object है जिसमें schedule और body होते हैं। Session cleanup, summary refresh या procedure call जैसे bounded database work के लिए useful है।
CREATE EVENT event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE]
DO event_body;Events direct parameters नहीं लेते; body fixed/computed values के साथ procedure call कर सकती है।
Scheduler Status और Configuration
SHOW VARIABLES LIKE 'event_scheduler';
SET GLOBAL event_scheduler = ON;
SHOW PROCESSLIST;| Value | Meaning |
|---|---|
| ON | Enabled events execute हो सकते हैं |
| OFF | Stopped; normally runtime पर ON हो सकता है |
| DISABLED | Startup state; runtime पर change नहीं |
MySQL 8.4 में documented default ON है, लेकिन hosting policy अलग हो सकती है। Live value inspect करें। DISABLED हो तो authorized hosting workflow से startup configuration और restart चाहिए।
super_read_only scheduler operation रोक सकता है जबकि variable ON दिखे। Error log और actual process inspect करें।Session-Cleanup Lab
DROP TABLE IF EXISTS event_run_log_lab;
DROP TABLE IF EXISTS sessions_event_lab;
CREATE TABLE sessions_event_lab (
session_id INT PRIMARY KEY,
user_id INT NOT NULL,
expires_at DATETIME NOT NULL,
INDEX ix_sessions_expires (expires_at)
) ENGINE=InnoDB;
CREATE TABLE event_run_log_lab (
run_id BIGINT PRIMARY KEY AUTO_INCREMENT,
event_name VARCHAR(64) NOT NULL,
rows_changed INT NOT NULL,
ran_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;
INSERT INTO sessions_event_lab VALUES
(1,101,CURRENT_TIMESTAMP-INTERVAL 2 DAY),
(2,102,CURRENT_TIMESTAMP+INTERVAL 1 DAY),
(3,103,CURRENT_TIMESTAMP-INTERVAL 1 HOUR),
(4,104,CURRENT_TIMESTAMP+INTERVAL 3 DAY);Sessions 1 और 3 expired हैं। Indexed predicate cleanup bounded रखता है। Log table execution visible बनाती है क्योंकि event के पास interactive output terminal नहीं।
One-Time Event Create और Verify करें
DELIMITER //
CREATE EVENT ev_cleanup_once
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 MINUTE
ON COMPLETION PRESERVE
COMMENT 'Tutorial: purge expired sessions once'
DO
BEGIN
DELETE FROM sessions_event_lab
WHERE expires_at < CURRENT_TIMESTAMP;
INSERT INTO event_run_log_lab(event_name,rows_changed)
VALUES ('ev_cleanup_once',ROW_COUNT());
END//
DELIMITER ;
SELECT session_id FROM sessions_event_lab ORDER BY session_id;DELIMITER mysql-client command है, server SQL नहीं। यह compound BEGIN...END body को एक statement में भेजने देता है; GUI tools का delimiter तरीका अलग हो सकता है।
ON COMPLETION PRESERVE last execution के बाद object retain करता है ताकि metadata inspect हो सके। Event enabled और global scheduler ON होना भी जरूरी है।
Recurring Event with STARTS और ENDS
DELIMITER //
CREATE EVENT ev_cleanup_hourly
ON SCHEDULE EVERY 1 HOUR
STARTS CURRENT_TIMESTAMP + INTERVAL 5 MINUTE
ENDS CURRENT_TIMESTAMP + INTERVAL 30 DAY
DO
BEGIN
DELETE FROM sessions_event_lab
WHERE expires_at < CURRENT_TIMESTAMP
LIMIT 1000;
INSERT INTO event_run_log_lab(event_name,rows_changed)
VALUES ('ev_cleanup_hourly',ROW_COUNT());
END//
DELIMITER ;LIMIT 1000 one run bound करता है। Plain SELECT COUNT(*) useful output नहीं देता; value table में store करें। Parameters के लिए:
CREATE EVENT ev_call_cleanup
ON SCHEDULE EVERY 1 DAY
DO CALL purge_expired_sessions(1000);Time Zones, Delay और Overlap
- Create/alter के समय session
time_zonedocument और eventTIME_ZONEinspect करें। - Cross-region systems में UTC prefer करें।
- MONTH जैसे calendar intervals fixed seconds से अलग behave करते हैं।
- Activation real-time guarantee नहीं; brief delay possible है।
- Same second वाले events का guaranteed order नहीं।
Execution interval से लंबी हो तो overlap हो सकता है। Exclusive work के लिए advisory lock:
IF GET_LOCK('cleanup_sessions',0)=1 THEN
DELETE FROM sessions_event_lab
WHERE expires_at < CURRENT_TIMESTAMP LIMIT 1000;
DO RELEASE_LOCK('cleanup_sessions');
END IF;Critical work में ownership, attempts और recovery record करने वाली durable queue/status table बेहतर है।
Privileges, Definer और Monitoring
- Create/alter/drop के लिए schema/global
EVENTprivilege। - Execution event
DEFINERprivileges से होता है। - Durable least-privileged definer रखें।
- Creator से EVENT revoke करने पर existing events automatically disable/delete नहीं होते।
- Schedule से पहले intended security context में body manually test करें।
SHOW EVENTS FROM your_database;
SHOW CREATE EVENT ev_cleanup_hourly;
SELECT EVENT_NAME,STATUS,LAST_EXECUTED,TIME_ZONE,DEFINER
FROM information_schema.EVENTS
WHERE EVENT_SCHEMA=DATABASE();LAST_EXECUTED activation दिखाता है, business success नहीं। Outcome log करें, error log monitor और missed runs पर alert रखें।
Alter, Disable, Enable और Drop
ALTER EVENT ev_cleanup_hourly DISABLE;
ALTER EVENT ev_cleanup_hourly
ON SCHEDULE EVERY 2 HOUR ENABLE;
DROP EVENT IF EXISTS ev_cleanup_hourly;- Review चाहिए तो event DISABLED create करें।
- Definitions migrations में रखें।
- Empty input, backlog, lock और duplicates test करें।
- Restart/failover के बाद scheduler verify करें।
- Time zone, definer, privileges और logs review करें।
mysqldump --eventsसे events backup करें।
prepared statements, procedures और backup/restore पढ़ें।
Official संदर्भ
Syntax, scheduler states, completion, privileges और monitoring official MySQL 8.4 manual से verify किए गए हैं।