Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Bật event_scheduler=vĩnh viễn trong MySQL (giữ sau restart)

Để event_scheduler luôn ON ngay cả sau khi restart MySQL, bạn phải cấu hình trong file cấu hình (my.cnf hoặc my.ini), không chỉ dùng SET GLOBAL (chỉ tạm thời).

Cách 1: Cấu hình file my.cnf / my.ini (Khuyên dùng, vĩnh viễn)

Linux/Mac: /etc/my.cnf hoặc /etc/mysql/my.cnf

[mysqld]
event_scheduler = ON

Windows: C:\ProgramData\MySQL\MySQL Server 8.0\my.ini

[mysqld]
event_scheduler = ON

Sau khi sửa: Restart MySQL

# Linux systemd
sudo systemctl restart mysqld

# Windows Services
net stop mysql80 && net start mysql80

Cách 2: SET GLOBAL (Chỉ tạm thời, mất khi restart)

SET GLOBAL event_scheduler = ON;
-- Hoặc
SET @@global.event_scheduler = ON;

Kiểm tra trạng thái

-- Xem biến toàn cục
SELECT @@global.event_scheduler;
-- Hoặc
SHOW VARIABLES LIKE 'event_scheduler';

Kết quả mong đợi: ON

Ví dụ minh họa từ tài liệu gốc

mysql> SELECT @@event_scheduler;
+-------------------+
| @@event_scheduler |
+-------------------+
| ON                |
+-------------------+

mysql> RESTART;  -- Giả lập restart
-- Mất kết nối tạm thời...

mysql> SELECT @@event_scheduler;
+-------------------+
| @@event_scheduler |
+-------------------+
| ON                |  -- Vẫn ON nếu đã config my.cnf
+-------------------+

Tạo Event ví dụ (chạy định kỳ)

-- Chỉ chạy được khi event_scheduler = ON
CREATE EVENT daily_cleanup
ON SCHEDULE EVERY 1 DAY
STARTS CURRENT_TIMESTAMP + INTERVAL 1 HOUR
DO
    DELETE FROM logs WHERE created_at < DATE_SUB(NOW(), INTERVAL 30 DAY);

Kiểm tra Event đang chạy

SHOW EVENTS;
-- Hoặc
SELECT * FROM information_schema.EVENTS WHERE EVENT_SCHEMA = 'ten_db';

Lưu ý quan trọng

  • event_scheduler là biến **GLOBAL**, không phải SESSION
  • Mặc định MySQL: OFF (tắt)
  • Một số shared hosting không cho sửa my.cnf → Hỏi support hoặc dùng cron job bên ngoài
  • Event không chạy nếu scheduler OFF, cũng không báo lỗi
  • Khi bật, các event ENABLED sẽ chạy theo lịch trình

Troubleshooting

Vấn đềNguyên nhânGiải pháp
Event không chạyevent_scheduler = OFFBật trong my.cnf + restart
Event chạy nhưng lỗiSQL error trong DO clauseKiểm tra error log, test SQL thủ công
Event bị DISABLEALTER EVENT ... DISABLEALTER EVENT ten_event ENABLE
Timezone saiServer timezone vs sessionSET time_zone = '+07:00' trong event