資料庫中經常有需要定時執行一些相關的任務的需求,在mssql中sql agnet,在mysql5.1以前,一般需要通過os的排程計畫(windows的計畫任務和linux的crontab)來實現,mysql5.1以後增加了乙個事件排程器,可以實現定時排程的功能。
一、使用許可權
單獨使用event呼叫sql語句時,檢視和建立需要使用者具有event許可權,呼叫該sql語句時,需要使用者具有執行該sql的許可權。event許可權的設定儲存在mysql.user表和mysql.db表的event_priv欄位中。
當event和procedure配合使用的時候,檢視和建立儲存過程需要使用者具有create routine許可權,呼叫儲存過程執行時需要使用excute許可權,儲存過程呼叫具體的sql語句時,需要使用者具有執行該sql的許可權
某個使用者建立的event ,在該使用者被刪除後,將無法繼續執行,event的定義使用者名稱在information_schema.events表的definer欄位中。
二、啟用event scheduler
檢視當前是否已啟用event scheduler的方法:
1) show variables like 'event_scheduler';
2) select @@event_scheduler;
3) show processlist;
啟用event scheduler的方法如下
:1) set global event_scheduler = 1 / on;
2) set @@global.event_scheduler = 1 / on;鍵值1
或者on
表示開啟;0或者
off表示關閉;
以上命令都是即時生效的,無需重啟服務
開啟事件計畫以後,可以通過
showprocesslist\g
看到有乙個相應的常駐程序:
三、建立event
建立event的語法如下:
delimiter $$
-- set global event_scheduler = on$$ -- required for event to execute but not create
create/*[definer = ]*/event `event_schema`.`event_name`
on schedule
/* uncomment the example below you want to use */
-- scheduleexample 1: run once
-- at 'yyyy-mm-dd hh:mm.ss'/current_timestamp
-- scheduleexample 2: run at intervals forever after creation
-- every 1 [hour|month|week|day|minute|...]
-- scheduleexample 3: specified start time, end time and interval for execution
/*every 1 [hour|month|week|day|minute|...]
starts current_timestamp/'yyyy-mm-dd hh:mm.ss'
ends current_timestamp/'yyyy-mm-dd hh:mm.ss' */
/*[on completion [not] preserve]
[enable | disable]
[comment 'comment']*/
dobegin
(sql_statements)
end$$
delimiter ;
說明:
event_schema:資料庫名稱
event_name :event名稱(event_schema.event_name 須唯一);
schedule有兩種形式 at和every
at 時間戳,單次任務
every,用來完成重複的計畫任務。
如果指定了[starts 時間戳] [ends時間戳],則是在指定的限期內,根據interval重複執行計畫任務。[on completion [not] preserve]:可選項,預設是on completion not preserve 即計畫任務執行完畢後自動drop該事件;on completion preserve則不會drop掉 。如果未指定則一直重複執行計畫任務。
[comment 'comment'] :可選項,comment 用來描述event;相當注釋,最大長度64個位元組。
[enable | disable] :設定event的狀態,預設enable:表示系統嘗試執行這個事件, disable:關閉該計畫事件。
do sql_statement: 需要執行的sql語句。
四、啟用/禁用/刪除事件
alter event evnet_name enable;
alter event evnet_name disable;
drop event evnet_name ;
五、使用示例:
mysql>create table test.t1 (id int,dt datetime);
mysql>insert into test.t1 select 1,now();
例1:
#每分鐘往t1表中插入一次記錄
delimiter $$
create event if not exists e_test1
on schedule every 1 minute
on completion preserve
do begin
insert into t1 select (select max(id) from test.t1)+1 as id ,now();
end$$
delimiter ;
例2:
#2天後刪除id小於1000的記錄
delimiter $$
create event if not exists e_test2
on schedule at current_timestamp + interval 10 day
on completion preserve
do begin
delete from test.t1 where id<1000;
end$$
delimiter ;
例3:
#每個月1號凌晨1點清空表
delimiter $$
create event if not exists e_test3
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
do begin
truncate table test.t1;
end$$
delimiter ;
例4:
#2023年1月1日零點清空表
delimiter $$
create event if not exists e_test4
on schedule at 『2014-01-01 00:00:00』
on completion preserve
do begin
truncate table test.t1;
end$$
delimiter ;
例5:
#2天後開始,1個月後停止
delimiter $$
create event if not exists e_test5
on schedule every 1 day
starts current_timestamp + interval 2 day
ends current_timestamp + interval 1 month
on completion preserve
do begin
truncate table test.t1;
end$$
delimiter ;
mysql event 排程歷史記錄
mysql 事件排程器 MySQL事件排程器
一 建立排程器 將資料庫按自定義的時間週期觸發某種操作,類似linux下的crontab 例項 建立排程器後的每個1小時觸發一次 create event myevent on schedule at current timestamp interval 1 hour doupdate mysche...
MySQL事件排程器
事件排程器 event scheduler 可以定時執行某些特定任務,可以看做基於時間的觸發器.show variables like event scheduler select event scheduler set global event scheduler 1 show create ev...
MYSQL 事件排程器
要檢視當前是否已開啟事件排程器 show variables like event scheduler 開啟事件高度器 set global event scheduler 1 建立事件 語法 create event if not exists event name on schedule sch...