Event Scheduler — avtomatik vazifalar
Muammodan boshlaylik
Muntazam bajariladigan vazifalar:
- Har kecha — kunlik statistikani hisoblash (34-dars)
- Har soat — 3 kundan beri to'lanmagan buyurtmalarni bekor qilish
- Har kuni — 90 kundan eski sessiya va loglarni o'chirish
- Har oy — yangi partition qo'shish (35-dars)
Odatda bu Linux cron orqali: skript yoziladi, cron uni ishga tushiradi, skript bazaga ulanadi. Lekin agar vazifa faqat SQL bo'lsa — buni MySQL ning o'zida ham qilish mumkin. Event Scheduler — bazaning ichki "cron" i.
Yoqish
SHOW VARIABLES LIKE 'event_scheduler'; -- ON (MySQL 8 da standart)
SET GLOBAL event_scheduler = ON;
Doimiy qilish — my.cnf da:
[mysqld]
event_scheduler = ON
Bir martalik event
CREATE EVENT aksiya_tugashi
ON SCHEDULE AT '2026-12-31 23:59:59'
DO
UPDATE mahsulotlar SET narx = asl_narx WHERE aksiyada = 1;
Belgilangan vaqtda bir marta bajariladi va (standart holatda) o'zini o'chiradi.
CREATE EVENT eslatma
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR
DO
INSERT INTO xabarlar (matn) VALUES ('1 soat o''tdi');
Takrorlanuvchi event
CREATE EVENT tolanmagan_buyurtmalarni_bekor_qilish
ON SCHEDULE EVERY 1 HOUR
STARTS CURRENT_TIMESTAMP
DO
UPDATE buyurtmalar
SET holat = 'bekor'
WHERE holat = 'yangi' AND yaratilgan < NOW() - INTERVAL 3 DAY;
| Jadval | Misol |
|---|---|
EVERY 5 MINUTE |
Har 5 daqiqada |
EVERY 1 HOUR |
Har soatda |
EVERY 1 DAY STARTS '2026-11-05 03:00:00' |
Har kuni soat 03:00 da |
EVERY 1 WEEK |
Har hafta |
EVERY 1 MONTH STARTS '2026-12-01 00:05:00' |
Har oyning 1-kuni |
... ENDS '2027-01-01' |
Shu sanagacha |
[!TIP] Og'ir vazifalarni tunda, kam yuklamali vaqtga qo'ying:
STARTS '2026-11-05 03:00:00'. Vaqt — server vaqt mintaqasida (@@time_zone).
Ko'p qadamli event
DELIMITER //
CREATE EVENT kunlik_tozalash
ON SCHEDULE EVERY 1 DAY STARTS '2026-11-05 03:00:00'
DO
BEGIN
-- 1. Kechagi statistika
INSERT INTO kunlik_statistika (kun, buyurtmalar, tushum)
SELECT DATE(b.yaratilgan), COUNT(DISTINCT b.id), COALESCE(SUM(q.soni * q.narx), 0)
FROM buyurtmalar b JOIN buyurtma_qatorlari q ON q.buyurtma_id = b.id
WHERE b.yaratilgan >= CURDATE() - INTERVAL 1 DAY AND b.yaratilgan < CURDATE()
AND b.holat <> 'bekor'
GROUP BY DATE(b.yaratilgan);
-- 2. Eski loglarni bo'laklab o'chirish
DELETE FROM kirish_loglari WHERE vaqt < NOW() - INTERVAL 90 DAY LIMIT 50000;
-- 3. Bajarilganini qayd etish
INSERT INTO event_jurnali (nom, vaqt) VALUES ('kunlik_tozalash', NOW());
END //
DELIMITER ;
Murakkab mantiq bo'lsa — event shunchaki procedure ni chaqiradi:
CREATE EVENT oylik_partition
ON SCHEDULE EVERY 1 MONTH STARTS '2026-12-01 00:10:00'
DO CALL partition_qosh_va_eskisini_ochir();
Boshqarish
SHOW EVENTS FROM dokon;
SHOW CREATE EVENT kunlik_tozalash\G
-- Vaqtincha to'xtatish va qayta yoqish
ALTER EVENT kunlik_tozalash DISABLE;
ALTER EVENT kunlik_tozalash ENABLE;
-- Jadvalni o'zgartirish
ALTER EVENT kunlik_tozalash ON SCHEDULE EVERY 1 DAY STARTS '2026-11-05 04:00:00';
DROP EVENT IF EXISTS kunlik_tozalash;
Oxirgi va keyingi bajarilish:
SELECT EVENT_NAME, STATUS, LAST_EXECUTED, INTERVAL_VALUE, INTERVAL_FIELD
FROM information_schema.EVENTS
WHERE EVENT_SCHEMA = 'dokon';
Bir martalik event ni bajarilgandan keyin saqlab qolish:
CREATE EVENT ... ON COMPLETION PRESERVE DO ...;
Xatolar va monitoring
Event xato bersa — u jimgina muvaffaqiyatsiz bo'ladi. Hech kim xabar olmaydi. Xato faqat MySQL error log da:
[ERROR] Event Scheduler: [root@localhost][dokon.kunlik_tozalash] Table 'dokon.kunlik_statistika' doesn't exist
Shuning uchun:
- Har bir event oxirida jurnalga yozing (yuqoridagi
event_jurnali) - Monitoring: "oxirgi 25 soatda
kunlik_tozalashyozuvi yo'q" → ogohlantirish - Xatoni ushlab jurnalga yozish uchun —
DECLARE EXIT HANDLER(41-dars)
Event Scheduler yoki cron?
| Event Scheduler | Cron + skript | |
|---|---|---|
| Faqat SQL vazifalar | ✅ Oddiy | Ortiqcha qadam |
| Tashqi amallar (email, API, fayl) | ❌ Mumkin emas | ✅ |
| Kod Git da, review | ⚠️ Migratsiya orqali | ✅ |
| Monitoring, loglar | ⚠️ Qiyin | ✅ Odatiy vositalar |
| Bir nechta MySQL server (replication) | ⚠️ Faqat source da ishlaydi | Siz boshqarasiz |
| Freymvork bilan | — | Laravel Scheduler, node-cron |
Amalda: ko'p loyihalar ilova scheduler idan foydalanadi (Laravel schedule:run, NestJS @Cron) — kod bir joyda, test va loglar odatiy. Event Scheduler — sof baza texnik xizmati uchun qulay: tozalash, partitionlar, statistika.
[!INFO] Replication da (53-dars) event lar replica larda avtomatik
DISABLEholatida yaratiladi — vazifa ikki marta bajarilmasligi uchun. Replica source ga aylantirilsa, event larni qo'lda yoqish kerak.
Nima uchun shunday?
Nima uchun bazaning ichida rejalashtiruvchi bo'lishi kerak — operatsion tizimda cron bor-ku?
Cron bilan ishlash uchun: server ga kirish huquqi, skript yozish, unga baza parolini berish, skriptning o'zini kuzatish kerak. Bulutdagi boshqariladigan bazalarda (AWS RDS, Google Cloud SQL) esa operatsion tizimga umuman kirish yo'q. Event Scheduler — bazaning o'z ichida, o'z huquqlari bilan ishlaydigan, alohida infratuzilma talab qilmaydigan vosita. Ma'lumot bazada, vazifa ham bazada.
Xulosa
Eslab qoling:
event_scheduler = ON— yoqilgan bo'lishi kerakCREATE EVENT nom ON SCHEDULE AT vaqt DO ...— bir martalikON SCHEDULE EVERY 1 DAY STARTS '... 03:00:00' DO ...— takrorlanuvchi- Ko'p qadam —
BEGIN ... END; murakkab —CALL procedure() ALTER EVENT ... DISABLE / ENABLE,SHOW EVENTS- Xatolar jim — jurnalga yozing va kuzating
- Faqat SQL vazifalar uchun; email, API — ilova scheduler i
Keyingi dars
45-dars: Cursor — satr-satr ishlash