MySQL數(shù)據(jù)庫定時任務舉例講解
1、事件概述
在MySQL 5.1中新增了一個特色功能事件調(diào)度器(Event Scheduler),簡稱事件。它可以作為定時任務調(diào)度器,取代部分原來只能用操作系統(tǒng)的計劃任務才能執(zhí)行的工作。另外,更值得一提的是,MySQL的事件可以實現(xiàn)每秒鐘執(zhí)行一個任務,這在一些對實時性要求較高的環(huán)境下是非常實用的。
事件調(diào)度器是定時觸發(fā)執(zhí)行的,從這個角度上看也可以稱作是“臨時觸發(fā)器”。但是它與觸發(fā)器又有所區(qū)別,觸發(fā)器只針對某個表產(chǎn)生的事件執(zhí)行一些語句,而事件調(diào)度器則是在某一段(間隔)時間執(zhí)行一些語句。
1.1 查看事件調(diào)度器是否開啟
事件由一個特定的線程來管理。啟用事件調(diào)度器后,擁有SUPER權限的賬戶執(zhí)行SHOW PROCESSLIST就可以看到這個線程了。
SHOW VARIABLES LIKE 'event_scheduler'; SELECT @@event_scheduler; SHOW PROCESSLIST;
1.2 開啟或關閉事件調(diào)度器
通過設定全局變量event_scheduler的值即可動態(tài)的控制事件調(diào)度器是否啟用。開啟MySQL的事件調(diào)度器,可以通過下面兩種方式實現(xiàn)。
1.2.1 通過設置全局參數(shù)
使用SET GLOBAL命令可以開啟或關閉事件。將event_scheduler參數(shù)的值設置為ON,則開啟事件;如果設置為OFF,則關閉事件。使用SET GLOBAL命令可以開啟或關閉事件。
-- 開啟事件調(diào)度器 SET GLOBAL event_scheduler = ON; -- 關閉事件調(diào)度器 SET GLOBAL event_scheduler = OFF; -- 查看事件調(diào)度器狀態(tài) SHOW VARIABLES LIKE 'event_scheduler';
注意:如果想要始終開啟事件,那么在使用SET GLOBAL開啟事件后,還需要在my.ini(Windows系統(tǒng))/my.cnf(Linux系統(tǒng))中添加event_scheduler=on。因為如果沒有添加,MySQL重啟事件后又會回到原來的狀態(tài)。
1.2.2 通過更改配置文件
在MySQL的配置文件my.ini(Windows系統(tǒng))/my.cnf(Linux系統(tǒng))中,找對[mysqld],然后在下面添加以下代碼開啟事件。
事件調(diào)度器啟動狀態(tài) event_scheduler = on
在配置文件中添加代碼并保存文件后,還需要重新啟動MySQL服務器才能生效。通過該方法開啟事件,重啟MySQL服務器后,不恢復為系統(tǒng)默認的狀態(tài)。
2、創(chuàng)建事件
在MySQL 5.1以上版本中,可以通過CREATE EVENT語句來創(chuàng)建事件。
示例1:創(chuàng)建名稱為event_user的事件,用于每隔5秒鐘向數(shù)據(jù)表tb_user(用戶信息表)中插入一條數(shù)據(jù)。
(1)首先創(chuàng)建tb_user(用戶信息表)。
-- 創(chuàng)建用戶信息表 CREATE TABLE IF NOT EXISTS tb_user ( id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用戶編號', name VARCHAR(30) NOT NULL COMMENT '用戶姓名', create_time TIMESTAMP COMMENT '創(chuàng)建時間' ) COMMENT = '用戶信息表';
(2)創(chuàng)建事件。
– 創(chuàng)建事件
CREATE EVENT IF NOT EXISTS event_user ON SCHEDULE EVERY 5 SECOND ON COMPLETION PRESERVE COMMENT '新增用戶信息定時任務' DO INSERT INTO tb_user(name,create_time) VALUES('pan_junbiao的博客',NOW());
示例2:創(chuàng)建一個事件,實現(xiàn)每個月的第一天凌晨1點統(tǒng)計一次已經(jīng)注冊的會員人數(shù),并插入到統(tǒng)計表中。
(1)創(chuàng)建名稱為p_total的存儲過程,用于統(tǒng)計已經(jīng)注冊的會員人數(shù),并插入到統(tǒng)計表tb_total中。
CREATE PROCEDURE p_total() BEGIN DECLARE n_total INT default 0; SELECT COUNT(*) INTO n_total FROM db_database11.tb_user; INSERT INTO tb_total (userNumber,createtime) VALUES(n_total,NOW()); END;
(2)創(chuàng)建名稱為e_autoTotal的事件,用于在每個月的第一天凌晨1點調(diào)用存儲過程。
CREATE EVENT IF NOT EXISTS e_autoTotal ON SCHEDULE EVERY 1 MONTH STARTS DATE_ADD(DATE_ADD(DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE())-1 DAY),INTERVAL 1 MONTH),INTERVAL 1 HOUR) ON COMPLETION PRESERVE ENABLE DO CALL p_total();
3、查詢事件
在MySQL中可以通過查詢information_schema.events表,查看已創(chuàng)建的事件。其語句如下:
SELECT * FROM information_schema.events;
4、修改事件
在MySQL 5.1及以后版本中,事件被創(chuàng)建之后,還可以使用ALTER EVENT語句修改其定義和相關屬性。其語法如下:
ALTER [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;
ALTER EVENT語句與CREATE EVENT語句基本相同。另外ALTER EVENT語句還有一個用法就是讓一個事件關閉或再次活動。
5、啟動與關閉事件
另外ALTER EVENT語句還有一個用法就是讓一個事件關閉或再次活動。
--啟動名稱為event_user的事件。 ALTER EVENT event_user ENABLE; --關閉名稱為event_user的事件。 ALTER EVENT event_user DISABLE;
6、刪除事件
在MySQL 5.1及以后版本中,刪除已經(jīng)創(chuàng)建的事件可以使用DROP EVENT語句來實現(xiàn)。
--刪除名稱為event_user的事件。 DROP EVENT IF EXISTS event_user;
7、時間配置
-- 單位有:SECOND,MINUTE,HOUR,DAY,WEEK(周),QUARTER(季度),MONTH,YEAR -- 每秒執(zhí)行1次 ON SCHEDULE EVERY 1 SECOND -- 每兩分鐘執(zhí)行1次 ON SCHEDULE EVERY 2 MINUTE -- 每3天執(zhí)行1次 ON SCHEDULE EVERY 3 DAY -- 5天后執(zhí)行 ON SCHEDULE AT CURRENT_TIMESTAMP()+INTERVAL 5 DAY -- 10分鐘后執(zhí)行 ON SCHEDULE AT CURRENT_TIMESTAMP()+INTERVAL 10 MINUTE -- 在2016年10月1日,晚上9點50執(zhí)行 ON SCHEDULE AT '2021-12-01 1:50:00' -- 5天后開始每天都執(zhí)行執(zhí)行到下個月底 ON SCHEDULE EVERY 1 DAY STARTS CURRENT_TIMESTAMP()+INTERVAL 5 DAY ENDS CURRENT_TIMESTAMP()+INTERVAL 1 MONTH -- 從現(xiàn)在起每天執(zhí)行,執(zhí)行5天 ON SCHEDULE EVERY 1 DAY ENDS CURRENT_TIMESTAMP()+INTERVAL 5 DAY -- 每天凌晨一點執(zhí)行 ON SCHEDULE EVERY 1 DAY STARTS DATE_ADD(DATE_ADD(CURDATE(), INTERVAL 1 DAY), INTERVAL 1 HOUR) -- 每個月的五號一點執(zhí)行一次 ON SCHEDULE EVERY 5 MONTH STARTS DATE_ADD(DATE_ADD(DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE())-1 DAY), INTERVAL 1 MONTH),INTERVAL 1 HOUR) -- 每年一月一號凌晨三點執(zhí)行一次 ON SCHEDULE EVERY 1 YEAR STARTS DATE_ADD(DATE(CONCAT(YEAR(CURDATE()) + 1,'-',1,'-',1)),INTERVAL 3 HOUR)
demo
-- 查看定時策略是否開啟 show variables like 'event_scheduler'; -- 開啟定時策略(ON是開啟狀態(tài)) set global event_scheduler=1; -- 創(chuàng)建procedure(存儲過程) use 123; delimiter // create procedure updateTime() begin -- (begin后end//前放要定時處理的sql用;結尾,可以放多個sql) update demo_table set demo_time = DATE_ADD(NOW(), INTERVAL FLOOR(1 + (RAND() * 10800)) SECOND ); end// delimiter ; -- 創(chuàng)建定時任務 create event updateTime_LY ON SCHEDULE EVERY 1 DAY STARTS DATE_ADD(DATE_ADD(CURDATE(), INTERVAL 1 DAY), INTERVAL 1 HOUR) on completion preserve disable do call updateTime(); -- 查看定時任務事件 SELECT event_name,event_definition,interval_value,interval_field,status FROM information_schema.EVENTS; -- 開啟和關閉創(chuàng)建好的事件 alter event updateTime_LY on completion preserve enable;//開啟定時任務 alter event updateTime_LY on completion preserve disable;//關閉定時任務 -- 刪除 drop event updateTime_LY;
總結
到此這篇關于MySQL數(shù)據(jù)庫定時任務的文章就介紹到這了,更多相關MySQL定時任務內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
mysql下的max_allowed_packet參數(shù)設置詳解
本文主要介紹了mysql下的max_allowed_packet參數(shù)設置詳解,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02MySQL在Centos7環(huán)境安裝的完整步驟記錄
在CentOS7環(huán)境下安裝MySQL是一項常見的任務,尤其對于那些沒有網(wǎng)絡連接或者需要在隔離環(huán)境中的開發(fā)者來說,離線安裝MySQL顯得尤為重要,這篇文章主要介紹了MySQL在Centos7環(huán)境安裝的完整步驟,需要的朋友可以參考下2024-10-10Linux中使用mysqladmin extended-status配合Linux命令查看MySQL運行狀態(tài)
這篇文章主要介紹了Linux中使用mysqladmin extended-status配合Linux命令查看MySQL運行狀態(tài),需要的朋友可以參考下2014-08-08MySQL 8.0.20 Window10免安裝版配置及Navicat管理教程圖文詳解
這篇文章主要介紹了MySQL 8.0.20 Window10免安裝版配置及Navicat管理,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06解決mysql的賦權操作之GRANT ALL PRIVILEGES ON *.*
這篇文章主要介紹了解決mysql的賦權操作之GRANT ALL PRIVILEGES ON *.* TO ‘root‘@‘%‘ IDENTIFIED BY ‘123456‘ WITH GRANT OPTION問題,本文給大家分享兩種情況分析分享解決方案,感興趣的朋友一起看看吧2022-11-11