-- CREATE TABLE `event_demo` ( -- `id` int(11) unsigned NOT NULL AUTO_INCREMENT, -- `name` varchar(16) NOT NULL, -- `seed` int(11) DEFAULT '0', -- `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新日期', -- PRIMARY KEY (`id`) -- ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; -- -- 【事件1】 :在某個時間點執行事件,只執行一次 DROP event IF EXISTS `event1`; CREATE EVENT `event1` ON SCHEDULE AT '2019-03-01 04:44:10' ON COMPLETION PRESERVE ENABLE COMMENT ' 2019-03-01 04:44:10 開始執行,執行了就結束了。這樣也能夠把 ON COMPLETION 設置成 NOT PRESERVE 。 就是執行結束的時候把事件也刪除。當前(PRESERVE)是不會把該事件刪除的' DO UPDATE event_demo SET seed = seed+1 WHERE id = 1; -- 【事件2】 :某個時間點加上時間單位以後執行事件(+ 表示在多久以後執行),只執行一次。 -- 例1: CURRENT_TIMESTAMP + INTERVAL 1 MONTH 從如今開始,過5個月執行事件 DROP event IF EXISTS `event2`; CREATE EVENT `event2` ON SCHEDULE AT '2019-03-01 05:13:10' + INTERVAL 5 SECOND ON COMPLETION PRESERVE ENABLE COMMENT '從 2019-03-01 05:13:10 開始 過5秒以後執行事件,執行完就不執行了,能夠把 ON COMPLETION 設置成 NOT PRESERVE 。' DO UPDATE event_demo SET seed = seed+1 WHERE id = 2; -- 【事件3】: 週期性的執行事件, 注意將 ON COMPLETION 設置成 NOT PRESERVE 是無效的,並不會刪除事件,依然會週期性的執行 -- 例1: EVERY 1 SECOND 從如今開始,每秒執行一次 -- 例2: EVERY 1 DAY 從如今開始,天天執行一次 DROP event IF EXISTS `event3`; CREATE EVENT `event3` ON SCHEDULE EVERY 1 DAY ON COMPLETION PRESERVE ENABLE COMMENT '天天執行一次事件' DO UPDATE event_demo SET seed = seed+1 WHERE id = 3; -- 【事件4】 : 在某個點以後,週期性的執行事件, 注意將 ON COMPLETION 設置成 NOT PRESERVE 是無效的,並不會刪除事件,依然會週期性的執行 -- STARTS 能夠是未來時間,也能夠是過去時間 -- 例1: EVERY 1 DAY STARTS '2019-03-01 04:44:10' 2019-03-01 04:44:10 以後天天執行一次 -- 例2: EVERY 1 HOUR STARTS '2019-03-01 04:44:10' 2019-03-01 04:44:10 以後每小時執行一次 DROP event IF EXISTS `event4`; CREATE EVENT `event4` ON SCHEDULE EVERY 1 MINUTE STARTS '2019-03-01 05:40:00' ON COMPLETION PRESERVE ENABLE COMMENT '每分鐘執行一次,從 2019-03-01 05:40:00 開始' DO UPDATE event_demo SET seed = seed+1 WHERE id = 4; -- 【事件5】: 在某個時間點以後的時間,週期性的執行事件 -- 例1:EVERY 1 SECOND STARTS '2019-03-01 04:50:10' + INTERVAL 5 SECOND 表示: 2019-03-01 04:50:10 再過5秒以後,每秒執行一次事件 DROP event IF EXISTS `event5`; CREATE EVENT `event5` ON SCHEDULE EVERY 1 SECOND STARTS '2019-03-01 04:50:10' + INTERVAL 5 SECOND ON COMPLETION PRESERVE ENABLE DO UPDATE event_demo SET seed = seed+1 WHERE id = 5; -- 【事件6】: 在某個時間點以後的時間,週期性的執行事件 ,並在指定時間點上終結事件。若是要刪除事件能夠把 ON COMPLETION 設置成 NOT PRESERVE 。 DROP event IF EXISTS `event6`; CREATE EVENT `event6` ON SCHEDULE EVERY 1 SECOND STARTS '2019-03-01 05:51:00' + INTERVAL 5 SECOND ENDS '2019-03-01 05:52:00' ON COMPLETION PRESERVE ENABLE COMMENT '從2019-03-01 05:51:05 開始觸發事件,到2019-03-01 05:52:00結束事件。以後不會再執行事件了' DO UPDATE event_demo SET seed = seed+1 WHERE id = 6; -- 【事件7】: 在某個時間點以後的時間,週期性的執行事件 ,並在指定時間點以後一段時間終結事件。若是要刪除事件能夠把 ON COMPLETION 設置成 NOT PRESERVE 。 DROP event IF EXISTS `event7`; CREATE EVENT `event7` ON SCHEDULE EVERY 1 SECOND STARTS '2019-03-01 05:51:00' + INTERVAL 5 SECOND ENDS '2019-03-01 05:52:00' + INTERVAL 5 SECOND ON COMPLETION PRESERVE ENABLE COMMENT '從2019-03-01 05:51:05 開始觸發事件,到2019-03-01 05:52:05結束事件。以後不會再執行事件了' DO UPDATE event_demo SET seed = seed+1 WHERE id = 7;
mysql 建立任務(事件)
一、檢查數據庫事件是否開啓,若是 event_scheduler 等於 NO表示開啓
SELECT @@event_scheduler;
SHOW VARIABLES LIKE 'event_scheduler';
SELECT @@event_scheduler;
二、開啓任務(事件)
a、set global event_scheduler=1;
b、SET GLOBAL event_scheduler = ON;
c、在my.cnf中的[mysqld]部分添加 event_scheduler=ON 而後重啓mysql。
三、關閉事件
SET GLOBAL event_scheduler = OFF;
四、語法:
mysql
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}
參數詳細說明:
DEFINER: 定義事件執行的時候檢查權限的用戶。
ON SCHEDULE schedule: 定義執行的時間和時間間隔。
ON COMPLETION [NOT] PRESERVE: 定義事件是一次執行仍是永久執行,默認爲一次執行,即NOT PRESERVE。
ENABLE | DISABLE | DISABLE ON SLAVE: 定義事件建立之後是開啓仍是關閉,以及在從上關閉。若是是從服務器自動同步主上的建立事件的語句的話,會自動加上DISABLE ON SLAVE。
COMMENT 'comment': 定義事件的註釋。
五、開啓事件
alter event event_name(事件名稱) ON COMPLETION PRESERVE ENABLE;
六、關閉事件
alter event event_name(事件名稱) ON COMPLETION PRESERVE DISABLE;
七、刪除事件
DROP EVENT [IF EXISTS] event_name(事件名稱)
八、案例sql
CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `t1` datetime DEFAULT NULL, `id2` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=106 DEFAULT CHARSET=utf8 <!-- 建立一個每隔3秒往test表中插入一條數據的事件 --> CREATE EVENT IF NOT EXISTS e_test_1 ON SCHEDULE EVERY 3 SECOND ON COMPLETION PRESERVE DO INSERT INTO test(id,t1) VALUES(NULL,NOW()); <!-- 建立一個10分鐘後清空test表數據的事件 --> CREATE EVENT IF NOT EXISTS e_test_2 ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 MINUTE DO TRUNCATE TABLE test; <!-- 調用存儲過程 --> 一、建立過程 CREATE PROCEDURE pro_test() BEGIN INSERT INTO test(id,t1,id2) VALUES(NULL,NOW(),'1000000'); END 二、調用過程 CREATE EVENT IF NOT EXISTS e_test_3 ON SCHEDULE EVERY 3 SECOND ON COMPLETION PRESERVE DO CALL pro_test();
九、關於事件的權限問題 (Access denied for user 'root'@'%' to database ‘xxxx’)
使用Naicat Premium遠程鏈接的mysql上面建立了一個新數據庫和新的用戶後,給該用戶添加這個新數據庫權限時出現:
access denied for user 'root'@'%' to database xxxx的提示。
錯誤的緣由是root用戶在遠程鏈接的MYSQL上面,沒有這個新數據庫的受權。在本地使用mysql應該不存在這個問題。
解決方法,執行受權:
UPDATE mysql.user SET Event_priv = 'Y' WHERE HOST='%' AND USER='root';
FLUSH PRIVILEGES;
grant all PRIVILEGES on xxxx.* to root@'%' identified by 'password' with grant option;
grant all on xxxx.* to 'root'@'%' identified by 'password' with grant option;
xxxx爲建立的數據庫,password爲root的密碼。請按實際要求進行更改。數據庫