Chúng ta đã khá quen thuộc với Cron Job trên Linux hoặc Task Scheduler trên Windows. Ở hệ quản trị CSDL MySQL/MariaDB cũng có 1 tính năng như vậy gọi là Event Scheduler. Chức năng chạy nền này sẽ giúp chúng ta thực hiện các nhiệm vụ theo 1 lịch trình đã định sẵn. Bây giờ vinasupport.com sẽ có 1 bài viết chi tiết về Event Scheduler.
Event Scheduler là gì?
Event Scheduler – Trình lập lịch sự kiện là một tính năng có trong MySQL/MariaDB cho phép bạn lên lịch các tác vụ chạy tự động tại một thời điểm hoặc khoảng thời gian cụ thể. Bạn có thể sử dụng các câu lệnh SQL để tạo, thay đổi và xóa bỏ các sự kiện.
Bật tính năng Event Scheduler
Kiểm tra tính năng Event Scheduler có đang hoạt động hay không bằng câu lệnh SQL sau:
SHOW VARIABLES WHERE VARIABLE_NAME = 'event_scheduler'
Nếu kết quả là “OFF” tức là nó đang không hoạt động. Mặc định MariaDB / MySQL sẽ không bật sẵn tính năng này.
Để kích hoạt nó lên tạm thời chúng ta sử dụng câu lệnh sau:
SET GLOBAL event_scheduler = ON;
Còn muốn được thiết lập vĩnh viễn, cả lúc khởi động thì chúng ta cần sửa file my.conf của phần mềm
Thêm “event_scheduler = ON” vào sau [mysqld] rồi khởi động lại MariaDB và MySQL
Trường hợp thiết lập config rồi mà vẫn gặp lỗi: 1577 – Cannot proceed, because event scheduler is disabled
Thì hãy chạy command mysql_upgrade trước
Tạo 1 Event Scheduler
Bạn có thể sử dụng Event Scheduler để lên lịch và tự động hóa các tác vụ xử lý cơ sở dữ liệu. MySQL Event Scheduler là một luồng chạy nền (background) và quản lý việc thực hiện các sự kiện đã được lên lịch.
Để tạo một sự kiện mới, bạn sử dụng câu lệnh CREATE EVENT
Cú pháp lệnh:
CREATE EVENT [IF NOT EXIST] event_name ON SCHEDULE schedule DO event_body
VD: Mình có 1 chức năng là hiển thị danh sách bài viết nhiều người người xem nhất trong tuần. Vì vậy trong bảng CSDL mình chỉ lưu các view record mà người xem trong 7 ngày gần nhất. Vì vậy mình lập 1 lịch hàng ngày xóa các record cũ hơn 7 ngày đi.
Tạo bảng CSDL
CREATE TABLE `wp_postviews_on_week` ( `postid` bigint(20) NOT NULL, `day` datetime NOT NULL, `pageviews` bigint(20) DEFAULT '1', `last_viewed` datetime NOT NULL, PRIMARY KEY (`postid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Tạo lịch chạy
CREATE EVENT IF NOT EXISTS delete_old_views ON SCHEDULE EVERY 1 DAY STARTS str_to_date( date_format(now(), '%Y%m%d 1200'), '%Y%m%d %H%i' ) ON COMPLETION PRESERVE ENABLE DO DELETE FROM `wp_postviews_on_week` WHERE `day` < DATE_SUB(CURDATE(), INTERVAL 7 DAY);
Kết quả: Chúng ta có lịch như bên dưới.
Nguồn: vinasupport.com