建立一個事件
當你排程的大部分內容與 SQL 相關且檔案相關性較低時,Mysql 具有 EVENT 功能,可以避免複雜的 cron 互動。請參見此處的手冊頁。將事件視為計劃以重複間隔執行的儲存過程。
為了節省除錯與事件相關的問題的時間,請記住必須開啟全域性事件處理程式來處理事件。
SHOW VARIABLES WHERE variable_name='event_scheduler';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| event_scheduler | OFF |
+-----------------+-------+
關閉它,什麼都不會觸發。所以開啟它:
SET GLOBAL event_scheduler = ON;
用於測試的模式
create table theMessages
( id INT AUTO_INCREMENT PRIMARY KEY,
userId INT NOT NULL,
message VARCHAR(255) NOT NULL,
updateDt DATETIME NOT NULL,
KEY(updateDt)
);
INSERT theMessages(userId,message,updateDt) VALUES (1,'message 123','2015-08-24 11:10:09');
INSERT theMessages(userId,message,updateDt) VALUES (7,'message 124','2015-08-29');
INSERT theMessages(userId,message,updateDt) VALUES (1,'message 125','2015-09-03 12:00:00');
INSERT theMessages(userId,message,updateDt) VALUES (1,'message 126','2015-09-03 14:00:00');
提供上述插入物以顯示起點。請注意,下面建立的 2 個事件將清除行。
建立 2 個活動,每天第 1 次,每 10 分鐘第 2 次
忽略他們實際在做什麼(互相對戰)。重點在於 INTERVAL 和日程安排。
DROP EVENT IF EXISTS `delete7DayOldMessages`;
DELIMITER $$
CREATE EVENT `delete7DayOldMessages`
ON SCHEDULE EVERY 1 DAY STARTS '2015-09-01 00:00:00'
ON COMPLETION PRESERVE
DO BEGIN
DELETE FROM theMessages
WHERE datediff(now(),updateDt)>6; -- not terribly exact, yesterday but <24hrs is still 1 day
-- Other code here
END$$
DELIMITER ;
…
DROP EVENT IF EXISTS `Every_10_Minutes_Cleanup`;
DELIMITER $$
CREATE EVENT `Every_10_Minutes_Cleanup`
ON SCHEDULE EVERY 10 MINUTE STARTS '2015-09-01 00:00:00'
ON COMPLETION PRESERVE
DO BEGIN
DELETE FROM theMessages
WHERE TIMESTAMPDIFF(HOUR, updateDt, now())>168; -- messages over 1 week old (168 hours)
-- Other code here
END$$
DELIMITER ;
顯示事件狀態(不同方法)
SHOW EVENTS FROM my_db_name; -- List all events by schema name (db name)
SHOW EVENTS;
SHOW EVENTS\G; -- <--------- I like this one from mysql> prompt
*************************** 1. row ***************************
Db: my_db_name
Name: delete7DayOldMessages
Definer: root@localhost
Time zone: SYSTEM
Type: RECURRING
Execute at: NULL
Interval value: 1
Interval field: DAY
Starts: 2015-09-01 00:00:00
Ends: NULL
Status: ENABLED
Originator: 1
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_general_ci
*************************** 2. row ***************************
Db: my_db_name
Name: Every_10_Minutes_Cleanup
Definer: root@localhost
Time zone: SYSTEM
Type: RECURRING
Execute at: NULL
Interval value: 10
Interval field: MINUTE
Starts: 2015-09-01 00:00:00
Ends: NULL
Status: ENABLED
Originator: 1
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_general_ci
2 rows in set (0.06 sec)
隨機的東西要考慮
DROP EVENT someEventName;
- 刪除事件及其程式碼
ON COMPLETION PRESERVE
- 當事件處理完畢後,保留它。否則,它將被刪除。
事件就像觸發器。它們不是由使用者程式呼叫的。相反,它們是預定的。因此,他們無聲地成功或失敗。
手冊頁的連結顯示了間隔選擇的相當多的靈活性,如下所示:
間隔:
quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE | DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
事件是處理系統重複和計劃任務的強大機制。它們可能包含儘可能多的語句,DDL 和 DML 例程,以及你可能合理希望的複雜連線。請參閱名為 儲存程式限制 的 MySQL 手冊頁。