MySQL Scheduled Event
Trong hướng dẫn này, chúng ta sẽ tìm hiểu về MySQL event scheduler và làm thế nào để tạo ra MySQL events để tự động hóa các tác vụ cơ sở dữ liệu. MySQL event là sự kiện được thực thi dựa theo một lịch trình được định sẵn. Khi bạn tạo ra một sự kiện, bạn đang tạo ra một đối tượng ...
Trong hướng dẫn này, chúng ta sẽ tìm hiểu về MySQL event scheduler và làm thế nào để tạo ra MySQL events để tự động hóa các tác vụ cơ sở dữ liệu.
MySQL event là sự kiện được thực thi dựa theo một lịch trình được định sẵn. Khi bạn tạo ra một sự kiện, bạn đang tạo ra một đối tượng cơ sở dữ liệu được đặt tên có chứa một hoặc nhiều câu lệnh SQL được thực thi tại một hoặc nhiều chu kỳ (lặp đi lặp lại) , bắt đầu và kết thúc trong một ngày và trong thời gian cụ thể. Về mặt khái niệm, điều này cũng tương tự như crontab Unix hoặc Windows Task Scheduler.
Bạn có thể sử dụng MySQL event trong nhiều trường hợp chẳng hạn như tối ưu hóa cơ sở dữ liệu bảng, xóa logs, lưu trữ dữ liệu, hoặc tạo các báo cáo phức tạp trong thời gian off.
MySQL event scheduler configuration
Theo mặc định, MySQL event scheduler không được kích hoạt.
1 2 3 |
SHOW PROCESSLIST; |
Để kích hoạt bạn cần phải thực hiện lệnh sau đây:
1 2 3 |
SET GLOBAL event_scheduler = ON; |
Khi đã kích hoạt, Bây giờ để xem trạng thái. ta run lại show processlist;
Để vô hiệu hóa và ngăn stop event scheduler, bạn thực hiện các lệnh SET GLOBAL với giá trị của event_scheduler = OFF:
1 2 3 4 |
myssql SET GLOBAL event_scheduler = OFF; |
Creating new MySQL events
Tạo một event tương tự để tạo các đối tượng cơ sở dữ liệu khác như stored procedures or triggers. Một sự kiện là một đối tượng có tên có chứa các câu lệnh SQL.
Stored procedure chỉ được thực thi khi nó được gọi, trigger chỉ thực khi có 1 sự kiện liên quan đến table như insert, update, delete. Event scheduler có thể được thực hiện tại một lần hay những khoảng thời gian theo 1 chu kỳ.
Để tạo và lập lịch một sự kiện mới, bạn sử dụng câu lệnh CREATE EVENT như sau:
1 2 3 4 5 6 |
CREATE EVENT [IF NOT EXISTS] event_name ON SCHEDULE schedule DO sql_statement; |
Giải thích:
1 2 3 4 5 6 7 8 9 10 |
schedule: AT timestamp [+ INTERVAL interval] | EVERY interval [STARTS timestamp] [ENDS timestamp] interval: quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE | DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND} |
- Đầu tiên bạn cần đặt 1 tên event sau mệnh đề CREATE EVENT. Tên event phải là duy nhất, k được trùng tên event đã có trong Database.
- Thứ 2: bạn đặt lịch sau mệnh đề [ON SCHEDULE].
- Nếu event này là 1 sự kiện thời gian, bạn sử dụng cú pháp
1 2 3 |
AT timestamp [+ INTERVAL] |
Nếu event là một sự kiện có định kỳ (lặp đi lặp lại), bạn sử dụng cú pháp:
1 2 3 |
EVERY interval [STARTS timestamp] [ENDS timestamp] |
- Thứ ba, bạn đặt các câu lệnh SQL sau từ khóa DO. Chú ý quan trọng, bạn có thể gọi một stored procedure tại đây, Trong trường hợp có nhiều câu lệnh sql bạn có thể viết trong tags [BEGIN ….END]
Hãy xem xét vài ví dụ tạo các events để hiểu được cú pháp trên.
Step1, tạo một bảng messeage bằng cách sử dụng câu lệnh CREATE TABLE như sau:
1 2 3 4 5 6 7 |
CREATE TABLE IF NOT EXISTS messages ( id INT PRIMARY KEY AUTO_INCREMENT, message VARCHAR(255) NOT NULL, created_at DATETIME NOT NULL ); |
Step2,Để lập lịch one-time event và chèn một messages vào một bảng bạn làm theo các bước sau :
1 2 3 4 5 6 7 |
CREATE EVENT IF NOT EXISTS test_event_01 ON SCHEDULE AT CURRENT_TIMESTAMP DO INSERT INTO messages(message,created_at) VALUES('Test MySQL Event 1',NOW()); |
step3, kiểm tra table messeages; bạn sẽ thấy 1 record đã đc tạo. Nó có nghĩa là event được thực hiện khi nó được tạo ra.
Để hiển thị tất cả các events trong database, bạn sử dụng câu lệnh sau:
1 2 3 |
SHOW EVENTS FROM demo_report; |
Chúng ta không thấy bất kỳ kết quả vì một sự kiện được tự động OFF đi khi nó hết hạn. Trong trường hợp trên, đó là một sự kiện được thực thi 1 lần và đã hết hạn khi thực thi của nó hoàn thành.
Để thay đổi, bạn có thể sử dụng mệnh đề ON COMPLETION PRESERVE. Câu lệnh sau đây thực hiện sau thời gian 1 phút sau khi event đc tạo.
1 2 3 4 5 6 7 8 |
CREATE EVENT test_event_02 ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 MINUTE ON COMPLETION PRESERVE DO INSERT INTO messages(message,created_at) VALUES('Test MySQL Event 2',NOW()); |
Chờ 1 phút, kiểm tra bảng table messeages, 1 record mới được thêm vào:
Nếu chúng ta thực hiện câu lệnh SHOW EVENTS FROM demo_report; một lần nữa, ta sẽ thấy trạng thái kết quả vì sử dụng mệnh đề ON COMPLETION PRESERVE
Câu lệnh sau đây tạo ra sự kiện định kỳ (lặp đi lặp lại) thực thi mỗi phút và hết hạn trong 1 giờ . tính từ khi event được thực thi:
1 2 3 4 5 6 7 8 9 |
CREATE EVENT test_event_03 ON SCHEDULE EVERY 1 MINUTE STARTS CURRENT_TIMESTAMP ENDS CURRENT_TIMESTAMP + INTERVAL 1 HOUR DO INSERT INTO messages(message,created_at) VALUES('Test MySQL recurring Event',NOW()); |
Chú ý rằng tôi sử dụng STARTS và ENDS để xác định khoảng thời gian hết hạn cho sự kiện này. Bạn có thể test sự kiện lặp lại này bằng cách chờ đợi vài phút và kiểm tra table messeage.
Result
Drop MySQL events
Để loại bỏ một sự kiện hiện tại trong database, bạn sử dụng câu lệnh DROP EVENT như sau:
1 2 3 |
DROP EVENT [IF EXIST] event_name; |
Ví dụ, để Xóa Event test_event_01, bạn sử dụng câu lệnh sau:
1 2 3 |
DROP EVENT [IF EXIST] test_event_01; |
Trong hướng dẫn này, bạn đã học về MySQL events, làm thế nào để tạo và xóa các sự kiện từ cơ sở dữ liệu.
Techtalk via Viblo