mysql中event的用法詳解
一、基本概念
mysql5.1版本開(kāi)始引進(jìn)event概念。event既“時(shí)間觸發(fā)器”,與triggers的事件觸發(fā)不同,event類(lèi)似與linux crontab計(jì)劃任務(wù),用于時(shí)間觸發(fā)。通過(guò)單獨(dú)或調(diào)用存儲(chǔ)過(guò)程使用,在某一特定的時(shí)間點(diǎn),觸發(fā)相關(guān)的SQL語(yǔ)句或存儲(chǔ)過(guò)程。
二、適用范圍
對(duì)于每隔一段時(shí)間就有固定需求的操作,如創(chuàng)建表,刪除數(shù)據(jù)等操作,可以使用event來(lái)處理。
例如:使用event在每月的1日凌晨1點(diǎn)自動(dòng)創(chuàng)建下個(gè)月需要使用的三張表。
三、使用權(quán)限
單獨(dú)使用event調(diào)用SQL語(yǔ)句時(shí),查看和創(chuàng)建需要用戶(hù)具有event權(quán)限,調(diào)用該SQL語(yǔ)句時(shí),需要用戶(hù)具有執(zhí)行該SQL的權(quán)限。Event權(quán)限的設(shè)置保存在mysql.user表和mysql.db表的Event_priv字段中。
當(dāng)event和procedure配合使用的時(shí)候,查看和創(chuàng)建存儲(chǔ)過(guò)程需要用戶(hù)具有create routine權(quán)限,調(diào)用存儲(chǔ)過(guò)程執(zhí)行時(shí)需要使用excute權(quán)限,存儲(chǔ)過(guò)程調(diào)用具體的SQL語(yǔ)句時(shí),需要用戶(hù)具有執(zhí)行該SQL的權(quán)限。
查看EVENT命令有如下幾種:
(1)查詢(xún)mysql.event表;
(2)通過(guò)SHOW EVENTS命令;
(3)通過(guò)SHOW FULL EVENTS命令;
(4)通過(guò)查詢(xún)information_schema.events表
(5)SHOW CREATE EVENT。
總之,event的使用頻率較低建議使用root用戶(hù)進(jìn)行創(chuàng)建和維護(hù)。
四、基本語(yǔ)法
4.1 開(kāi)啟定時(shí)器
要使event起作用,MySQL的常量GLOBAL event_scheduler必須為on或者是1。
-- 查看是否開(kāi)啟定時(shí)器
SHOW VARIABLES LIKE 'event_scheduler';
-- 開(kāi)啟定時(shí)器 0:off 1:on
SET GLOBAL event_scheduler = 1;
當(dāng)你設(shè)定事件計(jì)劃為0 或OFF,即關(guān)閉事件計(jì)劃進(jìn)程的時(shí)候,不會(huì)有新的事件執(zhí)行,但現(xiàn)有的正在運(yùn)行的事件會(huì)執(zhí)行到完畢
對(duì)于我們線(xiàn)上環(huán)境來(lái)說(shuō),使用event時(shí),注意在主庫(kù)上開(kāi)啟定時(shí)器,從庫(kù)上關(guān)閉定時(shí)器,event觸發(fā)所有操作均會(huì)記錄binlog進(jìn)行主從同步,從庫(kù)上開(kāi)啟定時(shí)器很可能造成卡庫(kù)。切換主庫(kù)后之后記得將新主庫(kù)上的定時(shí)器打開(kāi)。
請(qǐng)?zhí)貏e注意!
4.2 創(chuàng)建事件
CREATE EVENT 的語(yǔ)法如下:
CREATE EVENT
[IF NOT EXISTS] ---------------------------------------------*標(biāo)注1
event_name -----------------------------------------------------*標(biāo)注2
ON SCHEDULE schedule ------------------------------------*標(biāo)注3
[ON COMPLETION [NOT] PRESERVE] -----------------*標(biāo)注4
[ENABLE | DISABLE] ----------------------------------------*標(biāo)注5
[COMMENT 'comment'] --------------------------------------*標(biāo)注6
DO sql_statement -----------------------------------------------*標(biāo)注7
說(shuō)明:
標(biāo)注1:[IF NOT EXISTS]
使用IF NOT EXISTS,只有在同名event不存在時(shí)才創(chuàng)建,否則忽略。建議不使用以保證event創(chuàng)建成功。
標(biāo)注2:event_name
名稱(chēng)最大長(zhǎng)度可以是64個(gè)字節(jié)。名字必須是當(dāng)前Dateabase中唯一的,同一個(gè)數(shù)據(jù)庫(kù)不能有同名的event。
使用event常見(jiàn)的工作是創(chuàng)建表、插入數(shù)據(jù)、刪除數(shù)據(jù)、清空表、刪除表。
為了避免命名規(guī)范帶來(lái)的不便,最好讓事件名稱(chēng)具有描述整個(gè)事件的能力。建議命名規(guī)則如下為:動(dòng)作名稱(chēng)_(INTO/FROM_)表名_TIME,例如:
1. 每月創(chuàng)建(清空/刪除)fans表:
create(truncate/drop)_table_fans_month;
2. 每天從fans表插入(刪除)數(shù)據(jù):
insert(delete)_into(from)_fans_day;
標(biāo)注3:ON SCHEDULE
ON SCHEDULE 計(jì)劃任務(wù),有兩種設(shè)定計(jì)劃任務(wù)的方式:
1. AT 時(shí)間戳,用來(lái)完成單次的計(jì)劃任務(wù)。
2. EVERY 時(shí)間(單位)的數(shù)量時(shí)間單位[STARTS 時(shí)間戳] [ENDS時(shí)間戳],用來(lái)完成重復(fù)的計(jì)劃任務(wù)。
在兩種計(jì)劃任務(wù)中,時(shí)間戳可以是任意的TIMESTAMP 和DATETIME 數(shù)據(jù)類(lèi)型,時(shí)間戳需要大于當(dāng)前時(shí)間。
在重復(fù)的計(jì)劃任務(wù)中,時(shí)間(單位)的數(shù)量可以是任意非空(Not Null)的整數(shù)式,時(shí)間單位是關(guān)鍵詞:YEAR,MONTH,DAY,HOUR,MINUTE 或者SECOND。
提示: 其他的時(shí)間單位也是合法的如:QUARTER, WEEK, YEAR_MONTH,DAY_HOUR,DAY_MINUTE,DAY_SECOND,HOUR_MINUTE,HOUR_SECOND, MINUTE_SECOND,不建議使用這些不標(biāo)準(zhǔn)的時(shí)間單位。
標(biāo)注4: [ON COMPLETION [NOT] PRESERVE]
ON COMPLETION參數(shù)表示"當(dāng)這個(gè)事件不會(huì)再發(fā)生的時(shí)候",即當(dāng)單次計(jì)劃任務(wù)執(zhí)行完畢后或當(dāng)重復(fù)性的計(jì)劃任務(wù)執(zhí)行到了ENDS階段。而PRESERVE的作用是使事件在執(zhí)行完畢后不會(huì)被Drop掉,建議使用該參數(shù),以便于查看EVENT具體信息。
標(biāo)注5:[ENABLE | DISABLE]
參數(shù)Enable和Disable表示設(shè)定事件的狀態(tài)。Enable表示系統(tǒng)將執(zhí)行這個(gè)事件。Disable表示系統(tǒng)不執(zhí)行該事件。
可以用如下命令關(guān)閉或開(kāi)啟事件:
ALTER EVENT event_name ENABLE/DISABLE
標(biāo)注6:[COMMENT 'comment']
注釋會(huì)出現(xiàn)在元數(shù)據(jù)中,它存儲(chǔ)在information_schema表的COMMENT列,最大長(zhǎng)度為64個(gè)字節(jié)。'comment'表示將注釋內(nèi)容放在單引號(hào)之間,建議使用注釋以表達(dá)更全面的信息。
標(biāo)注 7: DO sql_statement
DO sql_statement字段表示該event需要執(zhí)行的SQL語(yǔ)句或存儲(chǔ)過(guò)程。這里的SQL語(yǔ)句可以是復(fù)合語(yǔ)句,例如:
BEGIN
CREATE TABLE test1;//創(chuàng)建表(需要測(cè)試一下)
DROP TABLE test2;//刪除表
CALL proc_test1();//調(diào)用存儲(chǔ)過(guò)程
END
使用BEGIN和END標(biāo)識(shí)符將復(fù)合SQL語(yǔ)句按照?qǐng)?zhí)行順序放在之間。當(dāng)然SQL語(yǔ)句是有限制的,對(duì)它的限制跟函數(shù)Function和觸發(fā)器Trigger 中對(duì)SQL語(yǔ)句的限制是一樣的,如果你在函數(shù)Function 和觸發(fā)器Trigger 中不能使用某些SQL,同樣的在EVENT中也不能使用。明確的來(lái)說(shuō)有下面幾個(gè):
LOCK TABLES
UNLOCK TABLES
CREATE EVENT
ALTER EVENT
LOAD DATA
4.3 執(zhí)行邏輯
For (已建立事件each event that has been created)
If (事件的狀態(tài)非DISABLE)
And (當(dāng)前時(shí)間在ENDS時(shí)間之前)
And (當(dāng)前時(shí)間在STARTS時(shí)間之后)
And (在上次執(zhí)行后經(jīng)過(guò)的時(shí)間)
And (沒(méi)有被執(zhí)行)
Then:
建立一個(gè)新的線(xiàn)程
傳遞事件的SQL語(yǔ)句給新的線(xiàn)程
(該線(xiàn)程在執(zhí)行完畢后會(huì)自動(dòng)關(guān)閉)
4.4 修改事件
使用ALTER EVENT 來(lái)修改事件,具體的ALTER語(yǔ)法如下,與創(chuàng)建事件的語(yǔ)法類(lèi)似:
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語(yǔ)句來(lái)刪除已經(jīng)創(chuàng)建的事件,語(yǔ)法如下:
DROP EVENT
[IF EXISTS]
event_name
但當(dāng)一個(gè)事件正在運(yùn)行中時(shí),刪除該事件不會(huì)導(dǎo)致事件停止,事件會(huì)執(zhí)行到完畢為止。使用DROP USER和DROP DATABASE 語(yǔ)句同時(shí)會(huì)將包含其中的事件刪除。
五、常用實(shí)例
每隔一秒自動(dòng)調(diào)用e_test()存儲(chǔ)過(guò)程
CREATE EVENT IF NOT EXISTS e_test
ON SCHEDULE EVERY 1 SECOND
ON COMPLETION PRESERVE
DO CALL e_test();
每個(gè)月的一號(hào)凌晨1 點(diǎn)執(zhí)行STAT()存儲(chǔ)過(guò)程:
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
- MySQL定時(shí)任務(wù)EVENT事件的使用方法
- MySQL 使用事件(Events)完成計(jì)劃任務(wù)
- MySQL定時(shí)任務(wù)(EVENT事件)如何配置詳解
- mysql定時(shí)任務(wù)(event事件)實(shí)現(xiàn)詳解
- MySQL數(shù)據(jù)庫(kù)Event定時(shí)執(zhí)行任務(wù)詳解
- 淺談MySQL event 計(jì)劃任務(wù)
- 詳解MySQL用事件調(diào)度器Event Scheduler創(chuàng)建定時(shí)任務(wù)
- MySQL定時(shí)器EVENT學(xué)習(xí)筆記
- MySQL查看event執(zhí)行記錄的實(shí)現(xiàn)
相關(guān)文章
MYSQL的binary解決mysql數(shù)據(jù)大小寫(xiě)敏感問(wèn)題的方法
BINARY不是函數(shù),是類(lèi)型轉(zhuǎn)換運(yùn)算符,它用來(lái)強(qiáng)制它后面的字符串為一個(gè)二進(jìn)制字符串,可以理解為在字符串比較的時(shí)候區(qū)分大小寫(xiě)2013-09-09解決MySQL登錄報(bào)錯(cuò)1130:1130?Host?***.***.***.***?is?not?allowe
有時(shí)候在登錄到MySQL服務(wù)器時(shí)會(huì)遇到1130錯(cuò)誤,這是因?yàn)闊o(wú)法連接到MySQL服務(wù)器或其他一些原因,這篇文章主要給大家介紹了關(guān)于解決MySQL登錄報(bào)錯(cuò)1130:1130?Host?***.***.***.***?is?not?allowed?to?connect?to?this?MySQL?server的相關(guān)資料,需要的朋友可以參考下2023-12-12關(guān)于數(shù)據(jù)庫(kù)中的查詢(xún)優(yōu)化
這篇文章主要介紹了關(guān)于數(shù)據(jù)庫(kù)中的查詢(xún)優(yōu)化,對(duì)于大型的應(yīng)用系統(tǒng),數(shù)據(jù)動(dòng)輒上百萬(wàn),就需要了解DBMS對(duì)查詢(xún)語(yǔ)句的處理過(guò)程和優(yōu)化算法,更好的利用其優(yōu)化算法,以提高系統(tǒng)的性能,需要的朋友可以參考下2023-07-07Window10下mysql 5.7.21 安裝配置方法圖文教程
這篇文章主要為大家詳細(xì)介紹了Window10下mysql 5.7.21 安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09mysql數(shù)據(jù)庫(kù)從服務(wù)器移植到個(gè)人PC的方法
有時(shí)候本地也需要數(shù)據(jù)庫(kù)進(jìn)行測(cè)試,那么就需要將服務(wù)器的東西移植到本地,如果有服務(wù)器控制權(quán)限,可以直接復(fù)制mysql的目錄(windows下),如果是別的那么就需要下面的方法了。2011-08-08在MySQL中使用子查詢(xún)和標(biāo)量子查詢(xún)的基本操作教程
這篇文章主要介紹了在MySQL中使用子查詢(xún)和標(biāo)量子查詢(xún)的基本操作教程,子查詢(xún)的使用時(shí)MySQL入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-12-12