一、背景
我們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;

從figure1可以知道bfsql@%是沒有event_priv權限的,在該使用者下建立事件的時候會出現下面的錯誤:
error code: 1044access denied for user 'bfsql'@'%' to database 'blog'
如果出現上面的錯誤,執行下面的sql就可以給bfsql@%賦予建立event的權限:
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語句按照執行順序放在之間。
--從現在開始每隔九天定時執行
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進行主從同步,從庫上開啟定時器很可能造成卡庫。切換主庫後之後記得将新主庫上的定時器打開。