天天看點

MySQL定時器Events

一、背景

我們mysql的表a的資料量已經達到1.6億,由于一些曆史原因,需要把表a的資料轉移到一個新表b,但是因為這是線上産品,是以當機時間需要盡量的短,在不影響資料持續入庫的情況下,我希望能通過作業(定時器events)的形式慢慢搬遷這些資料。

二、使用過程

(一)  檢視目前是否已開啟事件計劃(排程器)有3種方法:

1)     show variables like 'event_scheduler';

2)     select @@event_scheduler;

3)     show processlist;

(二)  開啟事件計劃(排程器)開關有4種方法:

1)     set global event_scheduler = 1;

2)     set @@global.event_scheduler = 1;

3)     set global event_scheduler = on;

4)     set @@global.event_scheduler = on;

鍵值1或者on表示開啟;0或者off表示關閉;

(三)  關于事件計劃的權限:

單獨使用event調用sql語句時,檢視和建立需要使用者具有event權限,調用該sql語句時,需要使用者具有執行該sql的權限。event權 限的設定儲存在mysql.user表和mysql.db表的event_priv字段中。(flush privileges;)

當event和procedure配合使用的時候,檢視和建立存儲過程需要使用者具有create routine權限,調用存儲過程執行時需要使用excute權限,存儲過程調用具體的sql語句時,需要使用者具有執行該sql的權限。

select host,user,event_priv from mysql.user;

MySQL定時器Events

從figure1可以知道bfsql@%是沒有event_priv權限的,在該使用者下建立事件的時候會出現下面的錯誤:

error code: 1044access denied for user 'bfsql'@'%' to database 'blog'

如果出現上面的錯誤,執行下面的sql就可以給bfsql@%賦予建立event的權限:

MySQL定時器Events

update mysql.user set event_priv = 'y' where host='%' and user='bfsql';  

flush privileges;  

最後,你可以通過show grants for 'bfsql'@'%';檢視所有權限;

(四)  建立事件:

1)     建立事件的文法如下:

create event [if not exists] event_name

on schedule schedule

[on completion [not] preserve]

[enable | disable]

[comment 'comment']

do sql_statement

2)     建立事件的示例如下:

delimiter $$

create event if not exists e_blog

on schedule every 30 second

on completion preserve

do begin

call moveblogdata();

end$$

delimiter ;

do sql_statement字段表示該event需要執行的sql語句或存儲過程。這裡的sql語句可以是複合語句,使用begin和end辨別符将複合sql語句按照執行順序放在之間。

MySQL定時器Events

--從現在開始每隔九天定時執行  

create  event event1  

on schedule every 9 day starts now()  

on completion preserve enable  

do  

    begin  

       call total();  

    end  

--每個月的一号淩晨1 點執行  

create  event event2     

on schedule every 1 month starts date_add(date_add(date_sub(curdate(),interval day(curdate())-1 day), interval 1 month),interval 1 hour)  

        call stat();  

---每個季度一号的淩晨2點執行  

create  event total_season_event  

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 2 hour)  

        call season_stat();  

--每年1月1号淩晨四點執行  

create  event total_year_event  

on schedule every 1 year starts date_add(date(concat(year(curdate()) + 1,'-',1,'-',1)),interval 4 hour)  

        call year_stat();  

(五)  事件開啟與關閉:

開啟某事件:alter event e_test on completion preserve enable;

關閉某事件:alter event e_test on completion preserve disable;

三、其它知識點

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