mysql创建定时器(event),查看定时器,打开定时器,设置定时器时间
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
??? 由于項(xiàng)目需要?jiǎng)?chuàng)建定時(shí)器(evevt),所以就百度了一下,發(fā)現(xiàn)基本都是來(lái)源于一個(gè)模板,有些功能還不全,現(xiàn)在自己總結(jié)一下。
注:mysql版本是從5.1開(kāi)始才支持event的。如果你的版本低于5.1就先升級(jí)版本吧。
查看版本的方法有很多,這里只給大家提供一個(gè)??? select version();
1.查看是否開(kāi)啟evevt與開(kāi)啟evevt。
1.1、MySQL evevt功能默認(rèn)是關(guān)閉的,可以使用下面的語(yǔ)句來(lái)看evevt的狀態(tài),如果是OFF或者0,表示是關(guān)閉的。
????????????? show VARIABLES LIKE '%sche%';
1.2、開(kāi)啟evevt功能
??????????? SET GLOBAL event_scheduler = 1;
2.創(chuàng)建定時(shí)器的過(guò)程
2.1、創(chuàng)建測(cè)試表test
drop table if exists test;
create table test
(
id int(11) not null auto_increment primary key,
time datetime not null
) engine=innodb default charset=utf8;
2.2、創(chuàng)建evevt要調(diào)用的存儲(chǔ)過(guò)程test_proce
delimiter //
drop procedure if exists test_proce//
create procedure test_proce()
begin
insert into test(time) values(now());
end//
delimiter ;
2.3、開(kāi)啟evevt(要使定時(shí)起作用,MySQL的常量GLOBAL event_scheduler必須為on或者是1)
執(zhí)行show variables like 'event_scheduler';查看evevt是否開(kāi)啟;
若沒(méi)開(kāi)啟執(zhí)行set global event_scheduler='on';
2.4、創(chuàng)建事件test_event(其作用:每隔一秒自動(dòng)調(diào)用test_proce()存儲(chǔ)過(guò)程)
drop event if exists test_event;
create event test_event
on schedule every 1 second
on completion preserve disable
do call test_proce();
2.5、開(kāi)啟事件test_event
alter event test_event on completion preserve enable;
2.6、關(guān)閉事件test_event
alter event test_event on completion preserve disable;
2.7、查看表test
select * from test;
?
3.查看自己創(chuàng)建的event
如果要查看更加詳細(xì)的信息,你需要root用戶的授權(quán),如果是你自己的數(shù)據(jù)庫(kù)你可以用下面語(yǔ)句查看
select * from? mysql.event;
下面的我的evevt的查看結(jié)果
4.event的時(shí)間設(shè)置
設(shè)置event很簡(jiǎn)單,但是麻煩的是如何設(shè)置執(zhí)行的時(shí)間,網(wǎng)上找了一些,自己總結(jié)了一下。
先看語(yǔ)句,如下面這個(gè)
???? CREATE EVENT test_event ON SCHEDULE EVERY 1 DAY STARTS '2012-09-24 00:00:00'
???? ON COMPLETION PRESERVE ENABLE DO CALL test_procedure();
EVERY 后面的是時(shí)間間隔,可以選 1 second,3 minute,5 hour,9 day,1 month,1 quarter(季度),1 year?
從2013年1月13號(hào)0點(diǎn)開(kāi)始,每天運(yùn)行一次
ON SCHEDULE EVERY 1 DAY STARTS '2013-01-13 00:00:00'
從現(xiàn)在開(kāi)始每隔九天定時(shí)執(zhí)行
ON SCHEDULE EVERY 9 DAY?STARTS NOW()?;
每個(gè)月的一號(hào)凌晨1 點(diǎn)執(zhí)行
on schedule every 1 month starts date_add(date_add(date_sub(curdate(),interval day(curdate())-1 day),interval 1 month),interval 1 hour);
每個(gè)季度一號(hào)的凌晨1點(diǎn)執(zhí)行
on schedule every 1 quarter starts date_add(date_add(date(concat(year(curdate()),'-',elt(quarter(curdate()),1,4,7,10),'-',1)),interval 1 quarter),interval 1 hour);
每年1月1號(hào)凌晨1點(diǎn)執(zhí)行
on schedule every 1 quarter starts date_add(date_add(date(concat(year(curdate()),'-',elt(quarter(curdate()),1,4,7,10),'-',1)),interval 1 quarter),interval 1 hour);
?
其他的 就大家自由組合了。。
?
?
附錄
?
1>使用權(quán)限
單獨(dú)使用event調(diào)用SQL語(yǔ)句時(shí),查看和創(chuàng)建需要用戶具有event權(quán)限,調(diào)用該SQL語(yǔ)句時(shí),需要用戶具有執(zhí)行該SQL的權(quán)限。Event權(quán)限的設(shè)置保存在mysql.user表和mysql.db表的Event_priv字段中。
當(dāng)event和procedure配合使用的時(shí)候,查看和創(chuàng)建存儲(chǔ)過(guò)程需要用戶具有create routine權(quán)限,調(diào)用存儲(chǔ)過(guò)程執(zhí)行時(shí)需要使用excute權(quán)限,存儲(chǔ)過(guò)程調(diào)用具體的SQL語(yǔ)句時(shí),需要用戶具有執(zhí)行該SQL的權(quán)限。
?
查看EVENT命令有如下幾種:
?
(1)查詢mysql.event表;
(2)通過(guò)SHOW EVENTS命令;
(3)通過(guò)SHOW FULL EVENTS命令;
(4)通過(guò)查詢information_schema.events表
(5)SHOW CREATE EVENT。
總之,event的使用頻率較低建議使用root用戶進(jìn)行創(chuàng)建和維護(hù)。
?
2>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
????? 名稱最大長(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)的不便,最好讓事件名稱具有描述整個(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í)間戳,用來(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ù)類型,時(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 EVEN
????????????????????????? ALTER EVENT
????????????????????????? LOAD DATA
?
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è)新的線程
傳遞事件的SQL語(yǔ)句給新的線程
(該線程在執(zhí)行完畢后會(huì)自動(dòng)關(guān)閉)
?
4>修改事件
?
使用ALTER EVENT 來(lái)修改事件,具體的ALTER語(yǔ)法如下,與創(chuàng)建事件的語(yǔ)法類似:
ALTER EVENT?? event_name
ON SCHEDULE schedule
[RENAME TO new_event_name]
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE]
[COMMENT 'comment']
DO sql_statement;
?
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ì)將包含其中的事件刪除。
?
show procedure status;
?
MYSQL中存儲(chǔ)過(guò)程的創(chuàng)建,調(diào)用及語(yǔ)法
(2011-12-01 16:19:46)
轉(zhuǎn)載▼
MySQL 存儲(chǔ)過(guò)程是從 MySQL 5.0 開(kāi)始增加的新功能。存儲(chǔ)過(guò)程的優(yōu)點(diǎn)有一籮筐。不過(guò)最主要的還是執(zhí)行效率和SQL 代碼封裝。特別是 SQL 代碼封裝功能,如果沒(méi)有存儲(chǔ)過(guò)程,在外部程序訪問(wèn)數(shù)據(jù)庫(kù)時(shí)(例如 PHP),要組織很多 SQL 語(yǔ)句。特別是業(yè)務(wù)邏輯復(fù)雜的時(shí)候,一大堆的 SQL 和條件夾雜在 PHP 代碼中,讓人不寒而栗?,F(xiàn)在有了 MySQL 存儲(chǔ)過(guò)程,業(yè)務(wù)邏輯可以封裝存儲(chǔ)過(guò)程中,這樣不僅容易維護(hù),而且執(zhí)行效率也高。
?
第一部分:創(chuàng)建一個(gè)簡(jiǎn)單的無(wú)參的存儲(chǔ)過(guò)程
1 用mysql客戶端登入
2 選擇數(shù)據(jù)庫(kù)
mysql>use test;
3 查詢當(dāng)前數(shù)據(jù)庫(kù)有哪些存儲(chǔ)過(guò)程
mysql>show procedure status where Db='test'; 4 創(chuàng)建一個(gè)簡(jiǎn)單的存儲(chǔ)過(guò)程 mysql>create procedure hi() select 'hello'; 5 存儲(chǔ)過(guò)程創(chuàng)建完畢,看怎么調(diào)用它 mysql>call hi(); 顯示結(jié)果 mysql> call hi(); +-------+ | hello | +-------+ | hello | +-------+ 1 row in set (0.00 sec)Query OK, 0 rows affected (0.01 sec) 6 一個(gè)簡(jiǎn)單的儲(chǔ)存過(guò)程就成功了,這只是一個(gè)演示,存儲(chǔ)過(guò)程可以一次執(zhí)行多個(gè)sql語(yǔ)句第二部分:創(chuàng)建一個(gè)有兩個(gè)參數(shù)的存儲(chǔ)過(guò)程一、MySQL 創(chuàng)建存儲(chǔ)過(guò)程 “pr_add” 是個(gè)簡(jiǎn)單的 MySQL 存儲(chǔ)過(guò)程,這個(gè)存儲(chǔ)過(guò)程有兩個(gè) int 類型的輸入?yún)?shù) “a”、“b”,返回這兩個(gè)參數(shù)的和。 drop procedure if exists pr_add;-- 計(jì)算兩個(gè)數(shù)之和create procedure pr_add(a int,b int) begin ? ?declare c int;if a is null thenset a = 0;end if;if b is null thenset b = 0;end if;set c = a + b;select c as sum; ? ?end; 二、調(diào)用 MySQL 存儲(chǔ)過(guò)程 call pr_add(10, 20); 執(zhí)行 MySQL 存儲(chǔ)過(guò)程,存儲(chǔ)過(guò)程參數(shù)為 MySQL 用戶變量。 set @a = 10;set @b = 20;call pr_add(@a, @b);三、MySQL 存儲(chǔ)過(guò)程特點(diǎn) 創(chuàng)建 MySQL 存儲(chǔ)過(guò)程的簡(jiǎn)單語(yǔ)法為: create procedure 存儲(chǔ)過(guò)程名字()([in|out|inout] 參數(shù) datatype )beginMySQL 語(yǔ)句;end;MySQL 存儲(chǔ)過(guò)程參數(shù)如果不顯式指定“in”、“out”、“inout”,則默認(rèn)為“in”。習(xí)慣上,對(duì)于是“in” 的參數(shù),我們都不會(huì)顯式指定。 1. MySQL 存儲(chǔ)過(guò)程名字后面的“()”是必須的,即使沒(méi)有一個(gè)參數(shù),也需要“()” 2. MySQL 存儲(chǔ)過(guò)程參數(shù),不能在參數(shù)名稱前加“@”,如:“@a int”。下面的創(chuàng)建存儲(chǔ)過(guò)程語(yǔ)法在 MySQL 中是錯(cuò)誤的(在 SQL Server 中是正確的)。 MySQL 存儲(chǔ)過(guò)程中的變量,不需要在變量名字前加“@”,雖然 MySQL 客戶端用戶變量要加個(gè)“@”。 create procedure pr_add(@a int,??-- 錯(cuò)誤b int? ? -- 正確)3. MySQL 存儲(chǔ)過(guò)程的參數(shù)不能指定默認(rèn)值。 4. MySQL 存儲(chǔ)過(guò)程不需要在 procedure body 前面加 “as”。而 SQL Server 存儲(chǔ)過(guò)程必須加 “as” 關(guān)鍵字。 create procedure pr_add(a int,b int)as? ?? ?? ?? ???-- 錯(cuò)誤,MySQL 不需要 “as”beginmysql statement ...;end;5. 如果 MySQL 存儲(chǔ)過(guò)程中包含多條 MySQL 語(yǔ)句,則需要 begin end 關(guān)鍵字。 create procedure pr_add(a int,b int)beginmysql statement 1 ...;mysql statement 2 ...;end;6. MySQL 存儲(chǔ)過(guò)程中的每條語(yǔ)句的末尾,都要加上分號(hào) “;” ? ?...declare c int;if a is null thenset a = 0;end if;...end;7. MySQL 存儲(chǔ)過(guò)程中的注釋。 declare c int;? ???-- 這是單行 MySQL 注釋 (注意 -- 后至少要有一個(gè)空格)if a is null then??# 這也是個(gè)單行 MySQL 注釋set a = 0;end if;...end;8. 不能在 MySQL 存儲(chǔ)過(guò)程中使用 “return” 關(guān)鍵字。 ? ?set c = a + b;select c as sum;end;9. 調(diào)用 MySQL 存儲(chǔ)過(guò)程時(shí)候,需要在過(guò)程名字后面加“()”,即使沒(méi)有一個(gè)參數(shù),也需要“()” call pr_no_param(); 10. 因?yàn)?MySQL 存儲(chǔ)過(guò)程參數(shù)沒(méi)有默認(rèn)值,所以在調(diào)用 MySQL 存儲(chǔ)過(guò)程時(shí)候,不能省略參數(shù)。可以用 null 來(lái)替代。 call pr_add(10, null);轉(zhuǎn)載于:https://my.oschina.net/lwaif/blog/821853
總結(jié)
以上是生活随笔為你收集整理的mysql创建定时器(event),查看定时器,打开定时器,设置定时器时间的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 做梦梦到一群小蛇是什么意思
- 下一篇: mysql命令行导入和导出数据