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

