mysql建立定時器(event),查看定時器,打開定時器,設置定時器時間

因爲項目須要建立定時器(evevt),因此就百度了一下,發現基本都是來源於一個模板,有些功能還不全,如今本身總結一下。
注:mysql版本是從5.1開始才支持event的。若是你的版本低於5.1就先升級版本吧。
查看版本的方法有不少,這裏只給你們提供一個    select version();
1.查看是否開啓evevt與開啓evevt。
1.一、MySQL evevt功能默認是關閉的,可使用下面的語句來看evevt的狀態,若是是OFF或者0,表示是關閉的。
              show VARIABLES LIKE '%sche%';
1.二、開啓evevt功能
            SET GLOBAL event_scheduler = 1;
2.建立定時器的過程
2.一、建立測試表test
drop table if exists test;
create table test
(
id int(11) not null auto_increment primary key,
time datetime not null
) engine=innodb default charset=utf8;
2.二、建立evevt要調用的存儲過程test_proce
delimiter //
drop procedure if exists test_proce//
create procedure test_proce()
begin
insert into test(time) values(now());
end//
delimiter ;
2.三、開啓evevt(要使定時起做用,MySQL的常量GLOBAL event_scheduler必須爲on或者是1)
執行show variables like 'event_scheduler';查看evevt是否開啓;
若沒開啓執行set global event_scheduler='on';
2.四、建立事件test_event(其做用:每隔一秒自動調用test_proce()存儲過程)
drop event if exists test_event;
create event test_event
on schedule every 1 second
on completion preserve disable
do call test_proce();
2.五、開啓事件test_event
alter event test_event on completion preserve enable;
2.六、關閉事件test_event
alter event test_event on completion preserve disable;
2.七、查看錶test
select * from test;
 
3.查看本身建立的event
若是要查看更加詳細的信息,你須要root用戶的受權,若是是你本身的數據庫你能夠用下面語句查看
select * from  mysql.event;
下面的個人evevt的查看結果
mysql建立定時器(event),查看定時器,打開定時器,設置定時器時間

4.event的時間設置
設置event很簡單,可是麻煩的是如何設置執行的時間,網上找了一些,本身總結了一下。
先看語句,以下面這個
     CREATE EVENT test_event ON SCHEDULE EVERY 1 DAY STARTS '2012-09-24 00:00:00'
     ON COMPLETION PRESERVE ENABLE DO CALL test_procedure();
EVERY 後面的是時間間隔,能夠選 1 second,3 minute,5 hour,9 day,1 month,1 quarter(季度),1 year 
從2013年1月13號0點開始,天天運行一次
ON SCHEDULE EVERY 1 DAY STARTS '2013-01-13 00:00:00'
從如今開始每隔九天定時執行
ON SCHEDULE EVERY 9 DAY STARTS NOW() ;
每月的一號凌晨1 點執行
on schedule every 1 month starts date_add(date_add(date_sub(curdate(),interval day(curdate())-1 day),interval 1 month),interval 1 hour);
每一個季度一號的凌晨1點執行
on schedule every 1 quarter starts date_add(date_add(date(concat(year(curdate()),'-',elt(quarter(curdate()),1,4,7,10),'-',1)),interval 1 quarter),interval 1 hour);
每一年1月1號凌晨1點執行
on schedule every 1 quarter starts date_add(date_add(date(concat(year(curdate()),'-',elt(quarter(curdate()),1,4,7,10),'-',1)),interval 1 quarter),interval 1 hour);
 
其餘的 就你們自由組合了。。
 
 
附錄
 
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用戶進行建立和維護。
 
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 EVEN
                          ALTER EVENT
                          LOAD DATA
 
3>執行邏輯
For (已創建事件each event that has been created)
If (事件的狀態非DISABLE)
And (當前時間在ENDS時間以前)
And (當前時間在STARTS時間以後)
And (在上次執行後通過的時間)
And (沒有被執行)
Then:
創建一個新的線程
傳遞事件的SQL語句給新的線程
(該線程在執行完畢後會自動關閉)
 
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;
 
5>刪除事件
 
EVENT使用DROP EVENT語句來刪除已經建立的事件,語法以下:
DROP EVENT  [IF EXISTS]  event_name;
 
但當一個事件正在運行中時,刪除該事件不會致使事件中止,事件會執行到完畢爲止。使用DROP USER和DROP DATABASE 語句同時會將包含其中的事件刪除。