mysql中event的用法詳解
一、基本概念
mysql5.1版本開始引進(jìn)event概念。event既“時(shí)間觸發(fā)器”,與triggers的事件觸發(fā)不同,event類似與linux crontab計(jì)劃任務(wù),用于時(shí)間觸發(fā)。通過單獨(dú)或調(diào)用存儲(chǔ)過程使用,在某一特定的時(shí)間點(diǎn),觸發(fā)相關(guān)的SQL語句或存儲(chǔ)過程。
二、適用范圍
對(duì)于每隔一段時(shí)間就有固定需求的操作,如創(chuàng)建表,刪除數(shù)據(jù)等操作,可以使用event來處理。
例如:使用event在每月的1日凌晨1點(diǎn)自動(dòng)創(chuàng)建下個(gè)月需要使用的三張表。
三、使用權(quán)限
單獨(dú)使用event調(diào)用SQL語句時(shí),查看和創(chuàng)建需要用戶具有event權(quán)限,調(diào)用該SQL語句時(shí),需要用戶具有執(zhí)行該SQL的權(quán)限。Event權(quán)限的設(shè)置保存在mysql.user表和mysql.db表的Event_priv字段中。
當(dāng)event和procedure配合使用的時(shí)候,查看和創(chuàng)建存儲(chǔ)過程需要用戶具有create routine權(quán)限,調(diào)用存儲(chǔ)過程執(zhí)行時(shí)需要使用excute權(quán)限,存儲(chǔ)過程調(diào)用具體的SQL語句時(shí),需要用戶具有執(zhí)行該SQL的權(quán)限。
查看EVENT命令有如下幾種:
(1)查詢mysql.event表;
(2)通過SHOW EVENTS命令;
(3)通過SHOW FULL EVENTS命令;
(4)通過查詢information_schema.events表
(5)SHOW CREATE EVENT。
總之,event的使用頻率較低建議使用root用戶進(jìn)行創(chuàng)建和維護(hù)。
四、基本語法
4.1 開啟定時(shí)器
要使event起作用,MySQL的常量GLOBAL event_scheduler必須為on或者是1。
-- 查看是否開啟定時(shí)器
SHOW VARIABLES LIKE 'event_scheduler';
-- 開啟定時(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ì)于我們線上環(huán)境來說,使用event時(shí),注意在主庫上開啟定時(shí)器,從庫上關(guān)閉定時(shí)器,event觸發(fā)所有操作均會(huì)記錄binlog進(jìn)行主從同步,從庫上開啟定時(shí)器很可能造成卡庫。切換主庫后之后記得將新主庫上的定時(shí)器打開。
請(qǐng)?zhí)貏e注意!
4.2 創(chuàng)建事件
CREATE EVENT 的語法如下:
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
說明:
標(biāo)注1:[IF NOT EXISTS]
使用IF NOT EXISTS,只有在同名event不存在時(shí)才創(chuàng)建,否則忽略。建議不使用以保證event創(chuàng)建成功。
標(biāo)注2:event_name
名稱最大長度可以是64個(gè)字節(jié)。名字必須是當(dāng)前Dateabase中唯一的,同一個(gè)數(shù)據(jù)庫不能有同名的event。
使用event常見的工作是創(chuàng)建表、插入數(shù)據(jù)、刪除數(shù)據(jù)、清空表、刪除表。
為了避免命名規(guī)范帶來的不便,最好讓事件名稱具有描述整個(gè)事件的能力。建議命名規(guī)則如下為:動(dò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í)間戳,用來完成單次的計(jì)劃任務(wù)。
2. EVERY 時(shí)間(單位)的數(shù)量時(shí)間單位[STARTS 時(shí)間戳] [ENDS時(shí)間戳],用來完成重復(fù)的計(jì)劃任務(wù)。
在兩種計(jì)劃任務(wù)中,時(shí)間戳可以是任意的TIMESTAMP 和DATETIME 數(shù)據(jù)類型,時(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)閉或開啟事件:
ALTER EVENT event_name ENABLE/DISABLE
標(biāo)注6:[COMMENT 'comment']
注釋會(huì)出現(xiàn)在元數(shù)據(jù)中,它存儲(chǔ)在information_schema表的COMMENT列,最大長度為64個(gè)字節(jié)。'comment'表示將注釋內(nèi)容放在單引號(hào)之間,建議使用注釋以表達(dá)更全面的信息。
標(biāo)注 7: DO sql_statement
DO sql_statement字段表示該event需要執(zhí)行的SQL語句或存儲(chǔ)過程。這里的SQL語句可以是復(fù)合語句,例如:
BEGIN
CREATE TABLE test1;//創(chuàng)建表(需要測(cè)試一下)
DROP TABLE test2;//刪除表
CALL proc_test1();//調(diào)用存儲(chǔ)過程
END
使用BEGIN和END標(biāo)識(shí)符將復(fù)合SQL語句按照?qǐng)?zhí)行順序放在之間。當(dāng)然SQL語句是有限制的,對(duì)它的限制跟函數(shù)Function和觸發(fā)器Trigger 中對(duì)SQL語句的限制是一樣的,如果你在函數(shù)Function 和觸發(fā)器Trigger 中不能使用某些SQL,同樣的在EVENT中也不能使用。明確的來說有下面幾個(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)過的時(shí)間)
And (沒有被執(zhí)行)
Then:
建立一個(gè)新的線程
傳遞事件的SQL語句給新的線程
(該線程在執(zhí)行完畢后會(huì)自動(dòng)關(guān)閉)
4.4 修改事件
使用ALTER EVENT 來修改事件,具體的ALTER語法如下,與創(chuàng)建事件的語法類似:
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語句來刪除已經(jīng)創(chuàng)建的事件,語法如下:
DROP EVENT
[IF EXISTS]
event_name
但當(dāng)一個(gè)事件正在運(yùn)行中時(shí),刪除該事件不會(huì)導(dǎo)致事件停止,事件會(huì)執(zhí)行到完畢為止。使用DROP USER和DROP DATABASE 語句同時(shí)會(huì)將包含其中的事件刪除。
五、常用實(shí)例
每隔一秒自動(dòng)調(diào)用e_test()存儲(chǔ)過程
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ǔ)過程:
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ù)庫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建立數(shù)據(jù)庫時(shí)字符集與排序規(guī)則的選擇詳解
當(dāng)數(shù)據(jù)庫需要適應(yīng)不同的語言就需要有不同的字符集,下面這篇文章主要給大家介紹了關(guān)于MySQL建立數(shù)據(jù)庫時(shí)字符集與排序規(guī)則的選擇的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06
mysql觸發(fā)器實(shí)現(xiàn)oracle物化視圖示例代碼
mysql觸發(fā)器實(shí)現(xiàn)oracle物化視圖即不是基于基表的虛表,而是根據(jù)表實(shí)際存在的實(shí)表,需要的朋友可以參考下2014-02-02
在MySQL中實(shí)現(xiàn)二分查找的詳細(xì)教程
這篇文章主要介紹了在MySQL中實(shí)現(xiàn)二分查找的詳細(xì)教程,來自計(jì)算機(jī)研究生考試原題,需要的朋友可以參考下2015-05-05
MySQL中設(shè)置服務(wù)器級(jí)別的默認(rèn)排序規(guī)則的方法
collation_server?是一個(gè)系統(tǒng)變量,它定義了服務(wù)器級(jí)別的默認(rèn)排序規(guī)則,本文主要介紹了MySQL中設(shè)置服務(wù)器級(jí)別的默認(rèn)排序規(guī)則的方法,具有一定的參考價(jià)值,感興趣的可以了解一下2024-08-08
Mysql 數(shù)據(jù)庫雙機(jī)熱備的配置方法
mysql數(shù)據(jù)庫沒有增量備份的機(jī)制,當(dāng)數(shù)據(jù)量太大的時(shí)候備份是一個(gè)很大的問題。還好mysql數(shù)據(jù)庫提供了一種主從備份的機(jī)制,其實(shí)就是把主數(shù)據(jù)庫的所有的數(shù)據(jù)同時(shí)寫到備份數(shù)據(jù)庫中。2010-06-06
MySQL開啟慢查詢?nèi)罩緇og-slow-queries的方法
MySQL中提供了一個(gè)慢查詢的日志記錄功能,可以把查詢SQL語句時(shí)間大于多少秒的語句寫入慢查詢?nèi)罩?,日常維護(hù)中可以通過慢查詢?nèi)罩镜挠涗浶畔⒖焖贉?zhǔn)確地判斷問題所在2016-05-05

