Free tutorials & notes in Hindi & English · Clean code examples · Mobile friendly learning
MySQL + SQL · Lesson 102

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;
सही scheduler चुनें: database-local, short, observable और idempotent work के लिए MySQL event। Files, email, HTTP APIs, long jobs और cross-service workflow के लिए OS scheduler/application worker।

Events direct parameters नहीं लेते; body fixed/computed values के साथ procedure call कर सकती है।

Scheduler Status और Configuration

SHOW VARIABLES LIKE 'event_scheduler';
SET GLOBAL event_scheduler = ON;
SHOW PROCESSLIST;
ValueMeaning
ONEnabled events execute हो सकते हैं
OFFStopped; normally runtime पर ON हो सकता है
DISABLEDStartup state; runtime पर change नहीं

MySQL 8.4 में documented default ON है, लेकिन hosting policy अलग हो सकती है। Live value inspect करें। DISABLED हो तो authorized hosting workflow से startup configuration और restart चाहिए।

Read-only server: 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 तरीका अलग हो सकता है।

Remaining sessions: 2, 4 ev_cleanup_once | 2

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_zone document और event TIME_ZONE inspect करें।
  • 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 EVENT privilege।
  • Execution event DEFINER privileges से होता है।
  • 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;
  1. Review चाहिए तो event DISABLED create करें।
  2. Definitions migrations में रखें।
  3. Empty input, backlog, lock और duplicates test करें।
  4. Restart/failover के बाद scheduler verify करें।
  5. Time zone, definer, privileges और logs review करें।
  6. mysqldump --events से events backup करें।

prepared statements, procedures और backup/restore पढ़ें।

Official संदर्भ

Syntax, scheduler states, completion, privileges और monitoring official MySQL 8.4 manual से verify किए गए हैं।

अक्सर पूछे जाने वाले प्रश्न (FAQ)

MySQL Event Scheduler क्या है?
यह server component है जो one-time या recurring schedule पर stored event objects activate करता है। Event application cron request के बिना MySQL में SQL चलाता है।
MySQL event क्यों नहीं चल रहा?
event_scheduler, event STATUS/schedule, definer privileges, LAST_EXECUTED, server time zone, super_read_only और MySQL error log check करें।
OFF और DISABLED में क्या अंतर है?
OFF scheduler रोकता है और normally runtime पर ON हो सकता है। DISABLED startup state है जिसमें scheduler nonoperational और runtime पर change नहीं होता।
क्या MySQL event SELECT result return कर सकता है?
Plain SELECT/SHOW result भेजने के लिए client नहीं होता, इसलिए वह store नहीं होता। INSERT SELECT, SELECT INTO, audit table या result persist करने वाली procedure use करें।
क्या recurring event executions overlap कर सकती हैं?
हाँ। Execution interval से लंबी हो तो next instance शुरू हो सकती है। Work idempotent रखें और unsafe concurrency में lock, queue या status row use करें।
🔗

Share this topic with a friend

यह topic किसी दोस्त को भेजें

Found it useful? Send it to a classmate learning the same thing.

अच्छा लगा? जो दोस्त यही सीख रहा है, उसे भेज दीजिए।

💻 लाइव कोड एडिटर

इस पेज के प्रोग्राम यहीं तैयार हैं — चलाएँ, बदलें और सीखें। कुछ भी इंस्टॉल किए बिना।
OneCompiler द्वारा संचालित। कोड एडिटर में अपने आप आ जाता है — Run दबाकर आउटपुट देखें। अगर एडिटर न खुले तो नए टैब में खोलें.