溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MySQL數(shù)據(jù)庫(kù)高級(jí)(八)——事件

發(fā)布時(shí)間:2020-08-01 17:52:01 來源:網(wǎng)絡(luò) 閱讀:5390 作者:天山老妖S 欄目:MySQL數(shù)據(jù)庫(kù)

MySQL數(shù)據(jù)庫(kù)高級(jí)(八)——事件

一、事件簡(jiǎn)介

1、事件簡(jiǎn)介

事件是用來執(zhí)行定時(shí)任務(wù)的一組SQL集,在時(shí)間到時(shí)會(huì)觸發(fā)。
一個(gè)事件可調(diào)用一次,也可周期性的啟動(dòng),由一個(gè)特定的事件調(diào)度器線程來管理的。
事件取代了原先只能由操作系統(tǒng)的計(jì)劃任務(wù)來執(zhí)行的工作,而且MySQL的事件調(diào)度器可以精確到每秒鐘執(zhí)行一個(gè)任務(wù),而操作系統(tǒng)的計(jì)劃任務(wù)(如:Linux下的CRON或Windows下的任務(wù)計(jì)劃)只能精確到每分鐘執(zhí)行一次。

2、事件的優(yōu)點(diǎn)

A、對(duì)數(shù)據(jù)定時(shí)性操作不再依賴外部程序,而直接使用數(shù)據(jù)庫(kù)本身提供的功能。
B、可以實(shí)現(xiàn)每秒鐘執(zhí)行一個(gè)任務(wù),在一些對(duì)實(shí)時(shí)性要求較高的環(huán)境下非常實(shí)用。

3、事件的缺點(diǎn)

定時(shí)觸發(fā),不可以調(diào)用。

4、事件的適用場(chǎng)景

對(duì)于每隔一段時(shí)間就有固定需求的操作,如創(chuàng)建表,刪除數(shù)據(jù)等操作,可以使用event來處理。

二、事件的操作

1、事件的創(chuàng)建

CREATE
[DEFINER = { user | CURRENT_USER }]
EVENT [IF NOT EXISTS] event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE | DISABLE ON SLAVE]
[COMMENT 'comment']
DO event_body;

event_name :事件名,不能超64個(gè)字符,名字必須是當(dāng)前Dateabase中唯一的,同一個(gè)數(shù)據(jù)庫(kù)不能有同名的event。創(chuàng)建事件時(shí),可以同時(shí)指定Schema,語法結(jié)構(gòu)為:schema_name.eventname。使用event常見的工作是創(chuàng)建表、插入數(shù)據(jù)、刪除數(shù)據(jù)、清空表、刪除表。為了規(guī)范事件命名,事件名稱需具備描述整個(gè)事件的能力。建議命名規(guī)則如下:動(dòng)作名稱(INTO/FROM_)表名_TIME,如每天插入表中記錄事件命名,insert_into_tablename_day。
ON SCHEDULE schedule:計(jì)劃任務(wù)
schedule:調(diào)度規(guī)則,規(guī)定事件的執(zhí)行時(shí)間與執(zhí)行規(guī)則。決定event的執(zhí)行時(shí)間和頻率(時(shí)間必須是將來的時(shí)間,過去的時(shí)間會(huì)出錯(cuò)),有AT和EVERY兩種形式。
語法結(jié)構(gòu)如下:
schedule:
AT timestamp [+ INTERVAL interval] ... | EVERY interval [STARTS timestamp [+ INTERVAL interval] ...] [ENDS timestamp [+ INTERVAL interval] ...]
interval:
quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
AT timestamp,用來完成單次的計(jì)劃任務(wù)。
EVERY n quantity [STARTS timestamp] [ENDS timestamp],用來完成重復(fù)的計(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。
AT timestamp一般用于只執(zhí)行一次,一般可以使用當(dāng)前時(shí)間加上延后的一段時(shí)間,例如:AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR;也可以定義一個(gè)時(shí)間常量,例如:AT '2006-02-10 23:59:00';EVERY interval一般用于周期性執(zhí)行,可以設(shè)定開始時(shí)間和結(jié)束時(shí)間。
ON COMPLETION [NOT] PRESERVE:事件到期后的操作,默認(rèn)事件到期后會(huì)自動(dòng)刪除。如果想保留事件使用ON COMPLETION PRESERVE;如果不想保留事件,可以設(shè)置ON COMPLETION NOT PRESERVE。
[ENABLE | DISABLE]:參數(shù)Enable和Disable表示設(shè)定事件的狀態(tài)。Enable表示系統(tǒng)將執(zhí)行事件,Disable表示系統(tǒng)不執(zhí)行事件。
[COMMENT 'comment']:增加注釋,注釋會(huì)出現(xiàn)在元數(shù)據(jù)中,存儲(chǔ)在information_schema表的COMMENT列,最大長(zhǎng)度為64個(gè)字節(jié)。'comment'表示將注釋內(nèi)容放在單引號(hào)之間,建議使用注釋以表達(dá)更全面的信息。
event_body:事件體,可以是單行SQL語法,或是BEGIN……END語句塊,或是存儲(chǔ)過程。

2、事件調(diào)度器的開啟

MySQL默認(rèn)關(guān)閉事件調(diào)度器。
查看事件調(diào)度器信息

show global variables like '%event_scheduler%';
SHOW PROCESSLIST;

開啟事件調(diào)度器
set global event_scheduler=ON;
在MySQL的my.cnf配置文件中修改。
event_scheduler?=?1?#或者ON??

3、事件的查看

 SELECT * FROM mysql.event;
    SHOW EVENTS;
    SELECT * FROM information_schema.events;

4、刪除事件

DROP EVENT [IF?EXISTS] eventname;

5、禁用事件

ALTER EVENT eventname DSIABLE;

6、開啟事件

ALTER EVENT eventname ENABLE;

7、事件的修改

ALTER
??? [DEFINER = { user | CURRENT_USER }]
??? EVENT event_name
??? [ON SCHEDULE schedule]
??? [ON COMPLETION [NOT] PRESERVE]
??? [RENAME TO new_event_name]
??? [ENABLE | DISABLE | DISABLE ON SLAVE]
??? [COMMENT 'comment']
??? [DO event_body]

三、事件實(shí)例

1、每隔一定時(shí)間插入一次記錄

創(chuàng)建一個(gè)表
CREATE TABLE event_table(timeline TIMESTAMP);
創(chuàng)建一個(gè)事件,每隔1秒插入一條記錄

CREATE EVENT insert_into_event_table_second
ON SCHEDULE EVERY 1 SECOND 
DO INSERT INTO schoolDB.event_table VALUES(CURRENT_TIMESTAMP);

過一定時(shí)間查看插入記錄
select * from event_table;
停止事件
alter event insert_into_event_table_second disable;
刪除事件
drop event insert_into_event_table_second;

2、特定時(shí)間插入一條記錄

創(chuàng)建一個(gè)事件在特定時(shí)間插入一條記錄

CREATE EVENT insert_into_event_table_time
ON SCHEDULE AT TIMESTAMP '2018-04-11 21:27:30'
DO INSERT INTO schoolDB.event_table values(CURRENT_TIMESTAMP);

在特定時(shí)間后查看插入記錄,已經(jīng)插入記錄
select * from event_table;

3、特定時(shí)間清空表

創(chuàng)建一個(gè)事件,特定時(shí)間清空表,事件執(zhí)行完后保留事件

CREATE EVENT truncate_event_table_time
ON SCHEDULE AT TIMESTAMP '2018-04-11 21:35:00'
ON COMPLETION PRESERVE
DO TRUNCATE TABLE schoolDB.event_table;

時(shí)間過后查詢表的內(nèi)容,已經(jīng)清空
select * from event_table;

4、某個(gè)事件段內(nèi)定時(shí)清空表

創(chuàng)建一個(gè)事件,5天后開啟,每天定時(shí)清空表,一個(gè)月后停止執(zhí)行

CREATE EVENT truncate_event_table_day
ON SCHEDULE EVERY 1 DAY 
STARTS CURRENT_TIMESTAMP + INTERVAL 5 DAY
ENDS CURRENT_TIMESTAMP + INTERVAL 1 MONTH
ON COMPLETION PRESERVE
DO TRUNCATE TABLE schoolDB.event_table;
向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI