共計 3213 個字符,預(yù)計需要花費 9 分鐘才能閱讀完成。
今天就跟大家聊聊有關(guān) MySQL 數(shù)據(jù)庫中怎么實現(xiàn)定時任務(wù),可能很多人都不太了解,為了讓大家更加了解,丸趣 TV 小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
一、事件概述
在 MySQL 5.1 中新增了一個特色功能事件調(diào)度器(Event Scheduler),簡稱事件。
事件 (event) 是 MySQL 在相應(yīng)的時刻調(diào)用的過程式數(shù)據(jù)庫對象。一個事件可調(diào)用一次,也可周期性的啟動,它由一個特定的線程來管理的,也就是所謂的“事件調(diào)度器”。
事件和觸發(fā)器類似,都是在某些事情發(fā)生的時候啟動。當(dāng)數(shù)據(jù)庫上啟動一條語句的時候,觸發(fā)器就啟動了,而事件是根據(jù)調(diào)度事件來啟動的。由于他們彼此相似,所以事件也稱為臨時性觸發(fā)器。事件取代了原先只能由操作系統(tǒng)的計劃任務(wù)來執(zhí)行的工作,而且 MySQL 的事件調(diào)度器可以精確到每秒鐘執(zhí)行一個任務(wù),而操作系統(tǒng)的計劃任務(wù) (如:Linux 下的 CRON 或 Windows 下的任務(wù)計劃) 只能精確到每分鐘執(zhí)行一次。
二、事件的優(yōu)缺點
優(yōu)點:一些對數(shù)據(jù)定時性操作不再依賴外部程序,而直接使用數(shù)據(jù)庫本身提供的功能。可以實現(xiàn)每秒鐘執(zhí)行一個任務(wù),這在一些對實時性要求較高的環(huán)境下就非常實用了。
缺點:定時觸發(fā),不可以調(diào)用。
三、事件調(diào)度器參數(shù)
事件由一個特定的線程來管理。啟用事件調(diào)度器后,擁有 SUPER 權(quán)限的賬戶執(zhí)行 SHOW PROCESSLIST 就可以看到這個線程了。
-- 查看事件是否開啟。SHOW VARIABLES LIKE event_scheduler SELECT @@event_scheduler;-- 全局開啟事件調(diào)度器 SET GLOBAL event_scheduler = ON;-- 全局關(guān)閉事件調(diào)度器 SET GLOBAL event_scheduler = OFF;-- 永久開啟事件調(diào)度器(在 my.cnf 配置文件中添加)# 事件調(diào)度器啟動狀態(tài) event_scheduler = on
四、創(chuàng)建事件
一條 create event 語句創(chuàng)建一個事件。每個事件由兩個主要部分組成,第一部分是事件調(diào)度(eventschedule,表示事件何時啟動以及按什么頻率啟動;
第二部分是事件動作(event action),這是事件啟動時執(zhí)行的代碼,事件的動作包含一條 SQL 語句,它可能是一個簡單地 insert 或者 update 語句,也可以使一個存儲過程或者
benin…end 語句塊,這兩種情況允許我們執(zhí)行多條 SQL。
一個事件可以是活動 (打開) 的或停止 (關(guān)閉) 的,活動意味著事件調(diào)度器檢查事件動作是否必須調(diào)用,停止意味著事件的聲明存儲在目錄中,但調(diào)度器不會檢查它是否應(yīng)該調(diào)用。在一個事件創(chuàng)建之后,它立即變?yōu)榛顒拥模粋€活動的事件可以執(zhí)行一次或者多次。
相關(guān)語法:
CREATE [DEFINER = { user | CURRENT_USER }] EVENT [IF NOT EXISTS] event_name ON SCHEDULE schedule [ON COMPLETION [NOT] PRESERVE] [ENABLE | DISABLE | DISABLE ON SLAVE] [COMMENT comment] DO event_body; schedule: AT timestamp [+ INTERVAL interval] ... | EVERY interval [STARTS timestamp [+ INTERVAL interval] ...] [ENDS timestamp [+ INTERVAL interval] ...] interval: quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE | DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
說明:
五、事件 (定時任務(wù)) 管理
1. 查詢事件
在 MySQL 中可以通過查詢 information_schema.events 表,查看已創(chuàng)建的事件。
-- 查看當(dāng)前所在庫的事件 show events;-- 查看所有事件 SELECT * FROM information_schema.events;
2. 修改事件
事件被創(chuàng)建之后,還可以使用 ALTER EVENT 語句修改其定義和相關(guān)屬性
ALTER[DEFINER={user | CURRENT_USER}]EVENT [IF NOT EXISTS] event_nameON SCHEDULE schedule[ON COMPLETION [NOT] PRESERVE][ENABLE | DISABLE | DISABLE ON SLAVE][COMMENT comment]DO event_body;
3. 啟動與關(guān)閉事件
ALTER EVENT 語句可以讓一個事件關(guān)閉或再次活動。
-- 啟動事件。ALTER EVENT event_name ENABLE;-- 關(guān)閉事件。ALTER EVENT event_name DISABLE;
4. 刪除事件
刪除已經(jīng)創(chuàng)建的事件可以使用 DROP EVENT 語句來實現(xiàn)。
DROP EVENT IF EXISTS event_name;
六、實例演示
1. 事件 +sql
創(chuàng)建名稱為 event_t1 的事件,用于每隔 5 秒鐘向數(shù)據(jù)表 t1(用戶信息表)中插入一條數(shù)據(jù)。
-- 創(chuàng)建用戶信息表 CREATE TABLE IF NOT EXISTS t1( id INT AUTO_INCREMENT PRIMARY KEY COMMENT 用戶編號 , name VARCHAR(30) NOT NULL COMMENT 用戶姓名 , create_time TIMESTAMP COMMENT 創(chuàng)建時間 ) COMMENT = 用戶信息表 -- 創(chuàng)建事件 CREATE EVENT IF NOT EXISTS event_t1ON SCHEDULE EVERY 5 SECONDON COMPLETION PRESERVECOMMENT 新增用戶信息定時任務(wù) DO INSERT INTO t1(name,create_time) VALUES(hwb ,NOW());
2. 事件 + 存儲過程
-- 創(chuàng)建總表 CREATE TABLE IF NOT EXISTS t_total( userNumber INT COMMENT 用戶數(shù) , createtime TIMESTAMP COMMENT 創(chuàng)建時間) COMMENT = 總表 -- 創(chuàng)建名稱為 t_total 的存儲過程,用于統(tǒng)計前面表插入的數(shù)量 CREATE PROCEDURE t_total()BEGIN DECLARE n_total INT default 0; SELECT COUNT(*) INTO n_total FROM t1; INSERT INTO t_total (userNumber,createtime) VALUES(n_total,NOW());END;-- 創(chuàng)建名稱為 event_total 的事件,用于在每天 12 點調(diào)用存儲過程。CREATE EVENT IF NOT EXISTS event_totalON SCHEDULE EVERY 1 DAY STARTS DATE_ADD(DATE_ADD(CURDATE(), INTERVAL 1 DAY), INTERVAL 12 HOUR)ON COMPLETION PRESERVE ENABLEDO CALL t_total();
看完上述內(nèi)容,你們對 MySQL 數(shù)據(jù)庫中怎么實現(xiàn)定時任務(wù)有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注丸趣 TV 行業(yè)資訊頻道,感謝大家的支持。