mysql创建定时器(event),查看定时器,打开定时器,设置定时器时间
為什么80%的碼農都做不了架構師?>>> ??
??? 由于項目需要創建定時器(evevt),所以就百度了一下,發現基本都是來源于一個模板,有些功能還不全,現在自己總結一下。
注:mysql版本是從5.1開始才支持event的。如果你的版本低于5.1就先升級版本吧。
查看版本的方法有很多,這里只給大家提供一個??? select version();
1.查看是否開啟evevt與開啟evevt。
1.1、MySQL evevt功能默認是關閉的,可以使用下面的語句來看evevt的狀態,如果是OFF或者0,表示是關閉的。
????????????? show VARIABLES LIKE '%sche%';
1.2、開啟evevt功能
??????????? SET GLOBAL event_scheduler = 1;
2.創建定時器的過程
2.1、創建測試表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、創建evevt要調用的存儲過程test_proce
delimiter //
drop procedure if exists test_proce//
create procedure test_proce()
begin
insert into test(time) values(now());
end//
delimiter ;
2.3、開啟evevt(要使定時起作用,MySQL的常量GLOBAL event_scheduler必須為on或者是1)
執行show variables like 'event_scheduler';查看evevt是否開啟;
若沒開啟執行set global event_scheduler='on';
2.4、創建事件test_event(其作用:每隔一秒自動調用test_proce()存儲過程)
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、開啟事件test_event
alter event test_event on completion preserve enable;
2.6、關閉事件test_event
alter event test_event on completion preserve disable;
2.7、查看表test
select * from test;
?
3.查看自己創建的event
如果要查看更加詳細的信息,你需要root用戶的授權,如果是你自己的數據庫你可以用下面語句查看
select * from? mysql.event;
下面的我的evevt的查看結果
4.event的時間設置
設置event很簡單,但是麻煩的是如何設置執行的時間,網上找了一些,自己總結了一下。
先看語句,如下面這個
???? 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 后面的是時間間隔,可以選 1 second,3 minute,5 hour,9 day,1 month,1 quarter(季度),1 year?
從2013年1月13號0點開始,每天運行一次
ON SCHEDULE EVERY 1 DAY STARTS '2013-01-13 00:00:00'
從現在開始每隔九天定時執行
ON SCHEDULE EVERY 9 DAY?STARTS NOW()?;
每個月的一號凌晨1 點執行
on schedule every 1 month starts date_add(date_add(date_sub(curdate(),interval day(curdate())-1 day),interval 1 month),interval 1 hour);
每個季度一號的凌晨1點執行
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號凌晨1點執行
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>使用權限
單獨使用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用戶進行創建和維護。
?
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 EVEN
????????????????????????? ALTER EVENT
????????????????????????? LOAD DATA
?
3>執行邏輯
For (已建立事件each event that has been created)
If (事件的狀態非DISABLE)
And (當前時間在ENDS時間之前)
And (當前時間在STARTS時間之后)
And (在上次執行后經過的時間)
And (沒有被執行)
Then:
建立一個新的線程
傳遞事件的SQL語句給新的線程
(該線程在執行完畢后會自動關閉)
?
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;
?
5>刪除事件
?
EVENT使用DROP EVENT語句來刪除已經創建的事件,語法如下:
DROP EVENT? [IF EXISTS]? event_name;
?
但當一個事件正在運行中時,刪除該事件不會導致事件停止,事件會執行到完畢為止。使用DROP USER和DROP DATABASE 語句同時會將包含其中的事件刪除。
?
show procedure status;
?
MYSQL中存儲過程的創建,調用及語法
(2011-12-01 16:19:46)
轉載▼
MySQL 存儲過程是從 MySQL 5.0 開始增加的新功能。存儲過程的優點有一籮筐。不過最主要的還是執行效率和SQL 代碼封裝。特別是 SQL 代碼封裝功能,如果沒有存儲過程,在外部程序訪問數據庫時(例如 PHP),要組織很多 SQL 語句。特別是業務邏輯復雜的時候,一大堆的 SQL 和條件夾雜在 PHP 代碼中,讓人不寒而栗。現在有了 MySQL 存儲過程,業務邏輯可以封裝存儲過程中,這樣不僅容易維護,而且執行效率也高。
?
第一部分:創建一個簡單的無參的存儲過程
1 用mysql客戶端登入
2 選擇數據庫
mysql>use test;
3 查詢當前數據庫有哪些存儲過程
mysql>show procedure status where Db='test'; 4 創建一個簡單的存儲過程 mysql>create procedure hi() select 'hello'; 5 存儲過程創建完畢,看怎么調用它 mysql>call hi(); 顯示結果 mysql> call hi(); +-------+ | hello | +-------+ | hello | +-------+ 1 row in set (0.00 sec)Query OK, 0 rows affected (0.01 sec) 6 一個簡單的儲存過程就成功了,這只是一個演示,存儲過程可以一次執行多個sql語句第二部分:創建一個有兩個參數的存儲過程一、MySQL 創建存儲過程 “pr_add” 是個簡單的 MySQL 存儲過程,這個存儲過程有兩個 int 類型的輸入參數 “a”、“b”,返回這兩個參數的和。 drop procedure if exists pr_add;-- 計算兩個數之和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; 二、調用 MySQL 存儲過程 call pr_add(10, 20); 執行 MySQL 存儲過程,存儲過程參數為 MySQL 用戶變量。 set @a = 10;set @b = 20;call pr_add(@a, @b);三、MySQL 存儲過程特點 創建 MySQL 存儲過程的簡單語法為: create procedure 存儲過程名字()([in|out|inout] 參數 datatype )beginMySQL 語句;end;MySQL 存儲過程參數如果不顯式指定“in”、“out”、“inout”,則默認為“in”。習慣上,對于是“in” 的參數,我們都不會顯式指定。 1. MySQL 存儲過程名字后面的“()”是必須的,即使沒有一個參數,也需要“()” 2. MySQL 存儲過程參數,不能在參數名稱前加“@”,如:“@a int”。下面的創建存儲過程語法在 MySQL 中是錯誤的(在 SQL Server 中是正確的)。 MySQL 存儲過程中的變量,不需要在變量名字前加“@”,雖然 MySQL 客戶端用戶變量要加個“@”。 create procedure pr_add(@a int,??-- 錯誤b int? ? -- 正確)3. MySQL 存儲過程的參數不能指定默認值。 4. MySQL 存儲過程不需要在 procedure body 前面加 “as”。而 SQL Server 存儲過程必須加 “as” 關鍵字。 create procedure pr_add(a int,b int)as? ?? ?? ?? ???-- 錯誤,MySQL 不需要 “as”beginmysql statement ...;end;5. 如果 MySQL 存儲過程中包含多條 MySQL 語句,則需要 begin end 關鍵字。 create procedure pr_add(a int,b int)beginmysql statement 1 ...;mysql statement 2 ...;end;6. MySQL 存儲過程中的每條語句的末尾,都要加上分號 “;” ? ?...declare c int;if a is null thenset a = 0;end if;...end;7. MySQL 存儲過程中的注釋。 declare c int;? ???-- 這是單行 MySQL 注釋 (注意 -- 后至少要有一個空格)if a is null then??# 這也是個單行 MySQL 注釋set a = 0;end if;...end;8. 不能在 MySQL 存儲過程中使用 “return” 關鍵字。 ? ?set c = a + b;select c as sum;end;9. 調用 MySQL 存儲過程時候,需要在過程名字后面加“()”,即使沒有一個參數,也需要“()” call pr_no_param(); 10. 因為 MySQL 存儲過程參數沒有默認值,所以在調用 MySQL 存儲過程時候,不能省略參數。可以用 null 來替代。 call pr_add(10, null);轉載于:https://my.oschina.net/lwaif/blog/821853
總結
以上是生活随笔為你收集整理的mysql创建定时器(event),查看定时器,打开定时器,设置定时器时间的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 做梦梦到一群小蛇是什么意思
- 下一篇: mysql命令行导入和导出数据