由於項目需要創建定時器(evevt),所以就百度了一下,發現基本都是來源於一個模板,有些功能還不全,現在自己總結一下。
注:mysql版本是從5.1開始才支持event的。如果你的版本低於5.1就先升級版本吧。
查看版本的方法有很多,這里只給大家提供一個 select version();
1.查看是否開啟evevt與開啟evevt。
1.1、MySQL evevt功能默認是關閉的,可以使用下面的語句來看evevt的狀態,如果是OFF或者0,表示是關閉的。
show VARIABLES LIKE '%sche%';
1.2、開啟evevt功能
SET GLOBAL event_scheduler = 1;
2.創建定時器的過程
2.1、創建測試表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.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.3、開啟evevt(要使定時起作用,MySQL的常量GLOBAL event_scheduler必須為on或者是1)
執行show variables like 'event_scheduler';查看evevt是否開啟;
若沒開啟執行set global event_scheduler='on';
2.4、創建事件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.5、開啟事件test_event
alter event test_event on completion preserve enable;
2.6、關閉事件test_event
alter event test_event on completion preserve disable;
2.7、查看表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 語句同時會將包含其中的事件刪除。