mysql中event的用法詳解。本站提示廣大學習愛好者:(mysql中event的用法詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是mysql中event的用法詳解正文
1、根本概念
mysql5.1版本開端引進event概念。event既“時光觸發器”,與triggers的事宜觸發分歧,event相似與linux crontab籌劃義務,用於時光觸發。經由過程零丁或挪用存儲進程應用,在某一特定的時光點,觸發相干的SQL語句或存儲進程。
2、實用規模
關於每隔一段時光就有固定需求的操作,如創立表,刪除數據等操作,可使用event來處置。
例如:應用event在每個月的1日清晨1點主動創立下個月須要應用的三張表。
3、應用權限
零丁應用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用戶停止創立和保護。
4、根本語法
4.1 開啟准時器
要使event起感化,MySQL的常量GLOBAL event_scheduler必需為on或許是1。
-- 檢查能否開啟准時器
SHOW VARIABLES LIKE 'event_scheduler';
-- 開啟准時器 0:off 1:on
SET GLOBAL event_scheduler = 1;
當你設定事宜籌劃為0 或OFF,即封閉事宜籌劃過程的時刻,不會有新的事宜履行,但現有的正在運轉的事宜會履行到終了
關於我們線上情況來講,應用event時,留意在主庫上開啟准時器,從庫上封閉准時器,event觸發一切操作均會記載binlog停止主從同步,從庫上開啟准時器極可能形成卡庫。切換主庫後以後記得將新主庫上的准時器翻開。
請特殊留意!
4.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 EVENT
ALTER EVENT
LOAD DATA
4.3 履行邏輯
For (已樹立事宜each event that has been created)
If (事宜的狀況非DISABLE)
And (以後時光在ENDS時光之前)
And (以後時光在STARTS時光以後)
And (在前次履行後經由的時光)
And (沒有被履行)
Then:
樹立一個新的線程
傳遞事宜的SQL語句給新的線程
(該線程在履行終了後會主動封閉)
4.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
4.5 刪除事宜
EVENT應用DROP EVENT語句來刪除曾經創立的事宜,語法以下:
DROP EVENT
[IF EXISTS]
event_name
但當一個事宜正在運轉中時,刪除該事宜不會招致事宜停滯,事宜會履行到終了為止。應用DROP USER和DROP DATABASE 語句同時會將包括個中的事宜刪除。
5、經常使用實例
每隔一秒主動挪用e_test()存儲進程
CREATE EVENT IF NOT EXISTS e_test
ON SCHEDULE EVERY 1 SECOND
ON COMPLETION PRESERVE
DO CALL e_test();
每一個月的一號清晨1 點履行STAT()存儲進程:
CREATE EVENT NOT EXISTS STAT
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 ENABLE
DO
BEGIN
CALL STAT();
END