Even – Sự kiện định kỳ trong Mysql

🎯 1️⃣ EVENT trong MySQL là gì?

EVENTcông cụ lập lịch (scheduler) trong MySQL, cho phép bạn chạy tự động một khối lệnh SQL hoặc thủ tục (procedure) vào một thời điểm xác định hoặc định kỳ lặp lại — giống như cron job trong hệ điều hành Linux.


⚙️ 2️⃣ Đặc điểm chính

Thuộc tính Giải thích
Được quản lý bởi MySQL Event Scheduler Cần bật trước khi dùng: SET GLOBAL event_scheduler = ON;
Chạy trên server, không phụ thuộc client Không cần ai đăng nhập — MySQL tự thực thi
Có thể chạy 1 lần hoặc định kỳ Dùng ON SCHEDULE AT ... (1 lần) hoặc ON SCHEDULE EVERY ... (lặp lại)
Thường gọi thủ tục hoặc lệnh SQL trực tiếp Ví dụ: CALL sp_check_capacity();
Có thể bật/tắt từng event hoặc toàn bộ scheduler ALTER EVENT ... ENABLE / DISABLE hoặc SET GLOBAL event_scheduler = OFF;

🧩 3️⃣ Cú pháp tổng quát

CREATE EVENT [IF NOT EXISTS] event_name
ON SCHEDULE 
    AT timestamp 
    | EVERY interval [STARTS timestamp] [ENDS timestamp]
DO
    sql_statement;

Ví dụ:

CREATE EVENT ev_auto_cleanup
ON SCHEDULE EVERY 1 DAY
STARTS CURRENT_TIMESTAMP + INTERVAL 1 HOUR
DO
  DELETE FROM backup_log WHERE recorded_at < NOW() - INTERVAL 30 DAY;

📘 Giải thích:

  • Event tên ev_auto_cleanup
  • Tự động chạy mỗi ngày một lần
  • Bắt đầu sau 1 giờ kể từ khi tạo
  • Thực hiện xóa bản ghi backup cũ hơn 30 ngày

🧠 4️⃣ Kiểm tra trạng thái Event Scheduler

SHOW VARIABLES LIKE 'event_scheduler';

Nếu trả về OFF, bạn bật nó bằng:

SET GLOBAL event_scheduler = ON;

🔍 5️⃣ Kiểm tra, bật/tắt, hoặc xóa event

SHOW EVENTS FROM ADMIN_DB;

ALTER EVENT ev_auto_cleanup DISABLE;
ALTER EVENT ev_auto_cleanup ENABLE;

DROP EVENT IF EXISTS ev_auto_cleanup;

💼 6️⃣ Ví dụ thực tế trong bài toán quản trị dữ liệu

🎯 Mục tiêu:

Tự động gọi chuỗi thủ tục quản trị mỗi ngày để:

  • Đồng bộ metadata
  • Ghi nhận hiệu năng
  • Kiểm tra dung lượng
  • Quét tài khoản người dùng

🧩 Ví dụ:

-- Đảm bảo thủ tục tổng hợp đã tồn tại
-- (sp_daily_admin_job được tạo ở phần trước)

CREATE EVENT IF NOT EXISTS ev_daily_admin_job
ON SCHEDULE EVERY 1 DAY
STARTS CURRENT_TIMESTAMP + INTERVAL 5 MINUTE
DO
  CALL sp_daily_admin_job();

📅 Tác dụng:

  • Mỗi ngày, MySQL tự chạy sp_daily_admin_job()
  • Thủ tục đó sẽ tự động: đồng bộ database, thu thập hiệu năng, ghi log cảnh báo, cập nhật dung lượng, v.v.
  • DBA không cần thao tác thủ công.

🔄 7️⃣ Kết hợp event + log giám sát

Để đảm bảo mọi event đều được ghi lại:

CREATE EVENT IF NOT EXISTS ev_log_event_status
ON SCHEDULE EVERY 1 DAY
DO
  INSERT INTO job_log (job_name, status, message)
  VALUES ('ev_log_event_status', 'SUCCESS', CONCAT('Event scheduler chạy lúc ', NOW()));

→ Giúp bạn biết chính xác event có đang hoạt động hay không.


🚨 8️⃣ Lưu ý khi sử dụng EVENT

Lưu ý Mô tả
🔒 Quyền hạn cần thiết Người tạo event cần quyền EVENT hoặc SUPER
⚙️ Chạy theo thời gian hệ thống server Cần kiểm tra múi giờ: SELECT @@global.time_zone;
🧹 Bảo trì định kỳ Event chỉ nên chạy lệnh nhẹ hoặc gọi thủ tục — không nên chứa logic nặng trực tiếp
🕒 Không nên tạo event trùng lịch Dễ gây nghẽn hoặc ghi log trùng
🧾 Có thể theo dõi qua information_schema.EVENTS Giúp DBA thống kê event đang chạy

🧭 9️⃣ Tổng kết

Khía cạnh Mục tiêu
Mục đích Tự động hóa các tác vụ quản trị (sao lưu, kiểm tra, cảnh báo)
Tần suất Hàng phút, giờ, ngày, tuần tùy nghiệp vụ
Kết hợp Với stored procedures để tách logic & kiểm soát lỗi
Quản lý Qua information_schema.EVENTS hoặc SHOW EVENTS
Bảo mật & ổn định Chỉ bật event_scheduler khi cần, tránh chạy code nặng

 

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *