MySQL 事件(event)計劃任務

準備、開啓mysql的event
修改/etc/my.cnf加入如下配置:
event_scheduler = 1
#更多方法請查看開啓mysql event的幾種方法

一、新建數據庫
mysql>create database event_1;

二、建表event_insert
CREATE TABLE `event` (
`id` tinyint(4) NOT NULL AUTO_INCREMENT, #自增長ID
`username` varchar(20) COLLATE utf8_unicode_ci NOT NULL, #用戶名
`password` varchar(20) COLLATE utf8_unicode_ci NOT NULL, #密碼
PRIMARY KEY (`id`) #主鍵ID
) ENGINE=MyISAM AUTO_INCREMENT=82 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

三、創建event計劃任務
create event event_1 #創建名爲event的計劃任務
   on schedule every second #設置時間,每秒鐘執行一次
   do insert into event_1.event(username,password) values("絕心","ostech") #do後面加SQL語句.本例爲插入

四、測試
查看是否表中是否有數據。


注意:5.1以後才支持!

MYSQL定期執行指定的一條命令。功能類似於crontab

1、 檢查你的MYSQL是否開了這個功能

SHOW VARIABLES LIKE 'event_scheduler';

我執行了一遍發現記錄爲空說明我的MYSQL沒有開呢。OK解決辦法

2、  打開你的MYSQL的計劃任務功能

使用這個功能之前必須確保event_scheduler已開啓,可執行

SET GLOBAL event_scheduler = 1;
SET GLOBAL event_scheduler = ON;
來開啓,也可以直接在啓動命令加上 “–event_scheduler=1”,例如:mysqld ... --event_scheduler=1

my.ini or my.cnf 中的
[mysqld]
添加 event_scheduler=ON

二、創建事件(CREATE EVENT)
先來看一下它的語法:

CREATE EVENT [IF NOT EXISTS] event_name
  ON SCHEDULE schedule
  [ON COMPLETION [NOT] PRESERVE]
  [ENABLE | DISABLE]
  [COMMENT 'comment']
  DO sql_statement;

schedule:
  AT TIMESTAMP [+ INTERVAL INTERVAL]
| EVERY INTERVAL [STARTS TIMESTAMP] [ENDS TIMESTAMP]

INTERVAL:
  quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
            WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
            DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}

#單次計劃任務: AT 時戳 
#重複的計劃任務 EVERY 時間(單位)的數量 時間單位 [STARTS 時戳][ENDS 時戳] 
在兩種計劃任務中,時戳可以是任意的TIMESTAMP 和DATETIME 數據類型,要求提供的是將來的時間(大於CURRENT_TIMESTAMP),而且小於Unix時間的最後時間(等於或小於'2037-12-31 23:59:59') 
時間單位是關鍵詞:YEAR,MONTH,DAY,HOUR,MINUTE 或者SECOND 
3.[ON COMPLETION [NOT] PRESERVE] COMPLETION 當單次計劃任務執行完畢後或當重複性的計劃任務執行到了ENDS階段。而聲明PRESERVE的作用是使事件在執行完畢後不會被Drop掉 
4.[ENABLE|DESABLE] ENABLE  開啓事件 DESABLE 關閉事件 
5.COMMENT 註釋 
6.DO sql_statement 執行的sql語句 


1) 首先來看一個簡單的例子來演示每秒插入一條記錄到數據表

USE test;
CREATE TABLE aaa (timeline TIMESTAMP);
CREATE EVENT e_test_insert
ON SCHEDULE EVERY 1 SECOND 
DO INSERT INTO test.aaa VALUES (CURRENT_TIMESTAMP);
等待3秒鐘後,再執行查詢看看:

mysql> SELECT * FROM aaa;
+---------------------+ 
| timeline            | 
+---------------------+ 
| 2007-07-18 20:44:26 | 
| 2007-07-18 20:44:27 | 
| 2007-07-18 20:44:28 | 
+---------------------+
2) 5
天后清空test表:

CREATE EVENT e_test
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 5 DAY
DO TRUNCATE TABLE test.aaa;
3) 2007年7月2012
點整清空test表:

CREATE EVENT e_test
ON SCHEDULE AT TIMESTAMP '2007-07-20 12:00:00'
DO TRUNCATE TABLE test.aaa;
4) 
每天定時清空test表:

CREATE EVENT e_test
ON SCHEDULE EVERY 1 DAY
DO TRUNCATE TABLE test.aaa;
5) 5
天后開啓每天定時清空test表:

CREATE EVENT e_test
ON SCHEDULE EVERY 1 DAY
STARTS CURRENT_TIMESTAMP + INTERVAL 5 DAY
DO TRUNCATE TABLE test.aaa;
6) 
每天定時清空test表,5天后停止執行:

CREATE EVENT e_test
ON SCHEDULE EVERY 1 DAY
ENDS CURRENT_TIMESTAMP + INTERVAL 5 DAY
DO TRUNCATE TABLE test.aaa;
7) 5
天后開啓每天定時清空test表,一個月後停止執行:

CREATE EVENT e_test
ON SCHEDULE EVERY 1 DAY
STARTS CURRENT_TIMESTAMP + INTERVAL 5 DAY
ENDS CURRENT_TIMESTAMP + INTERVAL 1 MONTH
DO TRUNCATE TABLE test.aaa;
[ON COMPLETION [NOT] PRESERVE]
可以設置這個事件是執行一次還是持久執行,默認爲NOT PRESERVE
8) 
每天定時清空test(只執行一次,任務完成後就終止該事件)

CREATE EVENT e_test
ON SCHEDULE EVERY 1 DAY
ON COMPLETION NOT PRESERVE
DO TRUNCATE TABLE test.aaa;
[ENABLE | DISABLE]
可是設置該事件創建後狀態是否開啓或關閉,默認爲ENABLE
[COMMENT ‘comment’]
可以給該事件加上註釋。

三、修改事件(ALTER EVENT)
ALTER EVENT event_name
  [ON SCHEDULE schedule]
  [RENAME TO new_event_name]
  [ON COMPLETION [NOT] PRESERVE]
  [COMMENT 'comment']
  [ENABLE | DISABLE]
  [DO sql_statement]
1) 
臨時關閉事件

ALTER EVENT e_test DISABLE;
2) 
開啓事件

ALTER EVENT e_test ENABLE;
3) 
將每天清空test表改爲5天清空一次:

ALTER EVENT e_test
ON SCHEDULE EVERY 5 DAY;
四、刪除事件(DROP EVENT)
語 法很簡單,如下所示:

DROP EVENT [IF EXISTS] event_name
例如刪除前面創建的e_test事件

DROP EVENT e_test;
當然前提是這個事件存在,否則會產生ERROR 1513 (HY000): Unknown event錯誤,因此最好加上IF EXISTS

DROP EVENT IF EXISTS e_test;

 create event test
ON SCHEDULE AT '2007-09-01 12:00:00' + INTERVAL 1 DAY
on completion not preserve 
do insert into yyy values('hhh','uuu');

解釋:從2007-09-01開始,每天對錶yyy120000進行一個插入操作。而且只執行一次(on completion not preserve 

我的計劃任務爲:

create event sysplan
ON SCHEDULE AT '2010-05-22 23:00:00' + INTERVAL 1 DAY
on completion not preserve 
do truncate table bjproj.ae_tmp;



三、通過設定全局變量event_scheduler 的值即可動態的控制事件調度器是否啓用。  
查看是否event_scheduler開啓 mysql> SHOW VARIABLES LIKE '%event%'; 
設置開啓 mysql> SET GLOBAL event_scheduler=ON; 
四、例子: 
每分鐘插入一條日誌: DELIMITER // CREATE EVENT `user_log_event` ON SCHEDULE EVERY 1 MINUTE STARTS '2010-12-27 00:00:00'  ON COMPLETION NOT PRESERVE ENABLE DO  BEGIN  INSERT INTO log SET addtime=NOW(); END // 
調用存儲過程: DELIMITER // CREATE EVENT `user_log_event` ON SCHEDULE EVERY 1 DAY STARTS '2010-00-00 00:00:00'  ON COMPLETION NOT PRESERVE ENABLE DO  BEGIN         CALL user_log_prov(); END //


一、基本概念
mysql5.1版本開始引進event概念。event既“時間觸發器”,與triggers的事件觸發不同,event類似與linux crontab計劃任務,用於時間觸發。通過單獨或調用存儲過程使用,在某一特定的時間點,觸發相關的SQL語句或存儲過程。

二、適用範圍
對於每隔一段時間就有固定需求的操作,如創建表,刪除數據等操作,可以使用event來處理。

例如:使用event在每月的1日凌晨1點自動創建下個月需要使用的三張表。

三、使用權限
單獨使用event調用SQL語句時,查看和創建需要用戶具有event權限,調用該SQL語句時,需要用戶具有執行該SQL的權限。Event權限的設置保存在mysql.user表和mysql.db表的Event_priv字段中。

當event和procedure配合使用的時候,查看和創建存儲過程需要用戶具有create routine權限,調用存儲過程執行時需要使用excute權限,存儲過程調用具體的SQL語句時,需要用戶具有執行該SQL的權限。
查看EVENT命令有如下幾種:
 
(1)查詢mysql.event表;

(2)通過SHOW EVENTS命令;

(3)通過SHOW FULL EVENTS命令;

(4)通過查詢information_schema.events表

(5)SHOW CREATE EVENT。
 
總之,event的使用頻率較低建議使用root用戶進行創建和維護。

四、基本語法

4.1 開啓定時器
要使event起作用,MySQL的常量GLOBAL event_scheduler必須爲on或者是1。
-- 查看是否開啓定時器

複製代碼代碼如下:

SHOW VARIABLES LIKE 'event_scheduler';

-- 開啓定時器 0:off 1:on 
複製代碼代碼如下:

SET GLOBAL event_scheduler = 1; 

當你設定事件計劃爲0 或OFF,即關閉事件計劃進程的時候,不會有新的事件執行,但現有的正在運行的事件會執行到完畢

對於我們線上環境來說,使用event時,注意在主庫上開啓定時器,從庫上關閉定時器,event觸發所有操作均會記錄binlog進行主從同步,從庫上開啓定時器很可能造成卡庫。切換主庫後之後記得將新主庫上的定時器打開。
請特別注意!

4.2 創建事件
CREATE EVENT 的語法如下:
CREATE EVENT
[IF NOT EXISTS] ---------------------------------------------*標註1
event_name -----------------------------------------------------*標註2

ON SCHEDULE schedule ------------------------------------*標註3 
[ON COMPLETION [NOT] PRESERVE] -----------------*標註4
[ENABLE | DISABLE] ----------------------------------------*標註5 
[COMMENT 'comment'] --------------------------------------*標註6 
DO sql_statement -----------------------------------------------*標註7

說明:
 
標註1:[IF NOT EXISTS]
 
使用IF NOT EXISTS,只有在同名event不存在時才創建,否則忽略。建議不使用以保證event創建成功。

標註2:event_name
 
名稱最大長度可以是64個字節。名字必須是當前Dateabase中唯一的,同一個數據庫不能有同名的event。

使用event常見的工作是創建表、插入數據、刪除數據、清空表、刪除表。

爲了避免命名規範帶來的不便,最好讓事件名稱具有描述整個事件的能力。建議命名規則如下爲:動作名稱_(INTO/FROM_)表名_TIME,例如:
1.     每月創建(清空/刪除)fans表:  
create(truncate/drop)_table_fans_month;
2.     每天從fans表插入(刪除)數據: 
insert(delete)_into(from)_fans_day;
標註3:ON SCHEDULE
 
ON SCHEDULE 計劃任務,有兩種設定計劃任務的方式:
 
1. AT 時間戳,用來完成單次的計劃任務。

2. EVERY 時間(單位)的數量時間單位[STARTS 時間戳] [ENDS時間戳],用來完成重複的計劃任務。

在兩種計劃任務中,時間戳可以是任意的TIMESTAMP 和DATETIME 數據類型,時間戳需要大於當前時間。

在重複的計劃任務中,時間(單位)的數量可以是任意非空(Not Null)的整數式,時間單位是關鍵詞:YEAR,MONTH,DAY,HOUR,MINUTE 或者SECOND。

提示: 其他的時間單位也是合法的如:QUARTER, WEEK, YEAR_MONTH,DAY_HOUR,DAY_MINUTE,DAY_SECOND,HOUR_MINUTE,HOUR_SECOND, MINUTE_SECOND,不建議使用這些不標準的時間單位。

標註4: [ON COMPLETION [NOT] PRESERVE]
 
ON COMPLETION參數表示"當這個事件不會再發生的時候",即當單次計劃任務執行完畢後或當重複性的計劃任務執行到了ENDS階段。而PRESERVE的作用是使事件在執行完畢後不會被Drop掉,建議使用該參數,以便於查看EVENT具體信息。

標註5:[ENABLE | DISABLE]
參數Enable和Disable表示設定事件的狀態。Enable表示系統將執行這個事件。Disable表示系統不執行該事件。

可以用如下命令關閉或開啓事件:

ALTER EVENT event_name  ENABLE/DISABLE
標註6:[COMMENT 'comment']
 
註釋會出現在元數據中,它存儲在information_schema表的COMMENT列,最大長度爲64個字節。'comment'表示將註釋內容放在單引號之間,建議使用註釋以表達更全面的信息。

標註 7: DO sql_statement
 
DO sql_statement字段表示該event需要執行的SQL語句或存儲過程。這裏的SQL語句可以是複合語句,例如:
BEGIN
CREATE TABLE test1;//創建表(需要測試一下)
DROP TABLE test2;//刪除表
CALL proc_test1();//調用存儲過程
END

使用BEGIN和END標識符將複合SQL語句按照執行順序放在之間。當然SQL語句是有限制的,對它的限制跟函數Function和觸發器Trigger 中對SQL語句的限制是一樣的,如果你在函數Function 和觸發器Trigger 中不能使用某些SQL,同樣的在EVENT中也不能使用。明確的來說有下面幾個:

LOCK TABLES
UNLOCK TABLES
CREATE EVENT
ALTER EVENT
LOAD DATA

4.3  執行邏輯
For (已建立事件each event that has been created)
If (事件的狀態非DISABLE)
And (當前時間在ENDS時間之前)
And (當前時間在STARTS時間之後)
And (在上次執行後經過的時間)
And (沒有被執行)
Then:
建立一個新的線程
傳遞事件的SQL語句給新的線程
(該線程在執行完畢後會自動關閉)

4.4 修改事件
使用ALTER EVENT 來修改事件,具體的ALTER語法如下,與創建事件的語法類似:
ALTER EVENT
event_name

ON SCHEDULE schedule
[RENAME TO new_event_name]
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE]
[COMMENT 'comment']
DO sql_statement

 
4.5 刪除事件
EVENT使用DROP EVENT語句來刪除已經創建的事件,語法如下:

DROP EVENT
[IF EXISTS]
event_name

 
但當一個事件正在運行中時,刪除該事件不會導致事件停止,事件會執行到完畢爲止。使用DROP USER和DROP DATABASE 語句同時會將包含其中的事件刪除。

五、常用實例
每隔一秒自動調用e_test()存儲過程

複製代碼代碼如下:

CREATE EVENT IF NOT EXISTS e_test
ON SCHEDULE EVERY 1 SECOND
ON COMPLETION PRESERVE
DO CALL e_test();

每個月的一號凌晨1 點執行STAT()存儲過程:
複製代碼代碼如下:

CREATE  EVENT  NOT EXISTS  STAT
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
BEGIN
CALL STAT();
END


DROP EVENT IF EXISTS eve1;

DELIMITER $$

CREATE EVENT eve1 ON SCHEDULE EVERY 1 SECOND STARTS NOW() ENDS NOW()+1
ON COMPLETION PRESERVE
DISABLE
DO
BEGIN
UPDATE testtable1 SET age = age+1 WHERE id = 1;
END$$

DELIMITER ;

SELECT * FROM testtable1;
SELECT NOW();



/*
標準創建語句EventsEvents

CREATE EVENT 事件任務名稱 ON SCHEDULE AT 時戳/EVERY 任意非空的整數 時間單位 [STARTS 時戳] [ENDS時戳]
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE]
[COMMENT '時間任務註釋']
DO
BEGIN
要執行的sql語句
END

ON SCHEDULE有兩種設定計劃任務的方式:
AT 時戳:單次的計劃任務
EVERY 任意非空的整數 時間單位 [STARTS 時戳] [ENDS時戳]:重複的計劃任務

設置了[STARTS 時戳] [ENDS時戳]表示只在該時間段內重複計劃任務
時戳可以是任意的TIMESTAMP 和DATETIME 數據類型。
要求提供的是將來的時間(大於CURRENT_TIMESTAMP),而且小於Unix時間的最後時間(等於或小於'2037-12-31 23:59:59')。
時間單位是關鍵詞:YEAR,MONTH,DAY,HOUR,MINUTE 或者SECOND。
提示: 其他的時間單位也是合法的如:QUARTER, WEEK, YEAR_MONTH,DAY_HOUR, DAY_MINUTE, DAY_SECOND, HOUR_MINUTE,HOUR_SECOND, MINUTE_SECOND,但他們是非標準不實用也不需要的。


[ON COMPLETION [NOT] PRESERVE]:
不寫默認是 ON COMPLETION NOT PRESERVE,表示當這個事件不會再發生的時候,即當單次計劃任務執行完畢後或當重複性的計劃任務執行到了ENDS階段,該事件任務即被drop掉。
ON COMPLETION PRESERVE 當事件任務結束後不被drop掉
提示: 基本不需要試用這個語句。


[ENABLE | DISABLE]
不寫默認是ENABLE
設定事件的狀態,如果是Enable 的話,那麼系統就會啓動這個事件,DISABLE則不啓動
可以用修改命令開啓或關閉事件,修改事件任務只要把關鍵字CREATE換成ALTER即可
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章