程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> mysql中event的用法詳解

mysql中event的用法詳解

編輯:MySQL綜合教程

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved