Mysql事件学习
Mysql事件學(xué)習(xí)
在系統(tǒng)管理或者數(shù)據(jù)庫管理中,經(jīng)常要周期性的執(zhí)行某一個(gè)命令或者SQL語句。對于linux系統(tǒng)熟悉的人都知道linux的cron計(jì)劃任務(wù),能很方便地實(shí)現(xiàn)定期運(yùn)行指定命令的功能。Mysql在5.1以后推出了事件調(diào)度器(Event Scheduler),和linux的cron功能一樣,能方便地實(shí)現(xiàn) mysql數(shù)據(jù)庫的計(jì)劃任務(wù),而且能精確到秒。使用起來非常簡單和方便。
由于最近需要用到事件這個(gè)功能,因此學(xué)習(xí)了一下,感覺非常棒,總結(jié)一下,方便以后使用,也希望能對其他的初學(xué)者有幫助。
一、??? 如果開啟事件
在使用事件這個(gè)功能,首先要保證你的mysql的版本是5.1以上,然后還要查看你的mysql服務(wù)器上的事件是否開啟。
查看事件是否開啟,使用如下命令查看:
SHOW VARIABLES LIKE 'event_scheduler';
SELECT @@event_scheduler;
SHOW PROCESSLIST;
如果看到event_scheduler為on或者PROCESSLIST中顯示有event_scheduler的信息說明就已經(jīng)開啟了事件。如果顯示為off或者在PROCESSLIST中查看不到event_scheduler的信息,那么就說明事件沒有開啟,我們需要開啟它。
開啟mysql的事件,通過如下三種方式開啟:
?? 通過動(dòng)態(tài)參數(shù)修改
SET GLOBAL event_scheduler = ON;
更改完這個(gè)參數(shù)就立刻生效了
注意:還是要在my.cnf中添加event_scheduler=ON。因?yàn)槿绻麤]有添加的話,mysql重啟事件又會(huì)回到原來的狀態(tài)了。
?? 更改配置文件然后重啟
在my.cnf中的[mysqld]部分添加如下內(nèi)容,然后重啟mysql。
event_scheduler=ON
?? 通過制定事件參數(shù)啟動(dòng)
mysqld ... --event_scheduler=ON
?
二、??? Mysql事件的語法簡介
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;
?
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}
參數(shù)詳細(xì)說明:
DEFINER: 定義事件執(zhí)行的時(shí)候檢查權(quán)限的用戶。
ON SCHEDULE schedule: 定義執(zhí)行的時(shí)間和時(shí)間間隔。
ON COMPLETION [NOT] PRESERVE: 定義事件是一次執(zhí)行還是永久執(zhí)行,默認(rèn)為一次執(zhí)行,即NOT PRESERVE。
ENABLE | DISABLE | DISABLE ON SLAVE: 定義事件創(chuàng)建以后是開啟還是關(guān)閉,以及在從上關(guān)閉。如果是從服務(wù)器自動(dòng)同步主上的創(chuàng)建事件的語句的話,會(huì)自動(dòng)加上DISABLE ON SLAVE。
COMMENT 'comment': 定義事件的注釋。
?
2.??????? 更改事件的語法
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]
3.??????? 刪除事件的語法
DROP EVENT [IF EXISTS] event_name
三、??? Mysql事件實(shí)戰(zhàn)
1.???????? 測試環(huán)境
創(chuàng)建一個(gè)用于測試的test表:
CREATE?TABLE?`test`?(
??`id`?int(11)?NOT?NULL?AUTO_INCREMENT,
??`t1`?datetime?DEFAULT?NULL,
??`id2`?int(11)?NOT?NULL?DEFAULT?'0',
??PRIMARY?KEY?(`id`)
)?ENGINE=InnoDB?AUTO_INCREMENT=106?DEFAULT?CHARSET=utf8
2.???????? 實(shí)戰(zhàn)1
?? 創(chuàng)建一個(gè)每隔3秒往test表中插入一條數(shù)據(jù)的事件,代碼如下:
CREATE EVENT IF NOT EXISTS test ON SCHEDULE EVERY 3 SECOND
ON COMPLETION PRESERVE
DO INSERT INTO test(id,t1) VALUES('',NOW());
?? 創(chuàng)建一個(gè)10分鐘后清空test表數(shù)據(jù)的事件
CREATE EVENT IF NOT EXISTS test
ON SCHEDULE
AT CURRENT_TIMESTAMP + INTERVAL 1 MINUTE
DO TRUNCATE TABLE test.aaa;
?? 創(chuàng)建一個(gè)在2012-08-23 00:00:00時(shí)刻清空test表數(shù)據(jù)的事件,代碼如下:
CREATE EVENT IF NOT EXISTS test
ON SCHEDULE
AT TIMESTAMP '2012-08-23 00:00:00'
DO TRUNCATE TABLE test;
?? 創(chuàng)建一個(gè)從2012年8月22日21點(diǎn)45分開始到10分鐘后結(jié)束,運(yùn)行每隔3秒往test表中插入一條數(shù)據(jù)的事件,代碼如下:
CREATE EVENT IF NOT EXISTS test ON SCHEDULE EVERY 3 SECOND
STARTS '2012-08-22 21:49:00'?
ENDS '2012-08-22 21:49:00'+ INTERVAL? 10 MINUTE
ON COMPLETION PRESERVE
DO INSERT INTO test(id,t1) VALUES('',NOW());
?
3.???????? 實(shí)戰(zhàn)2
通常的應(yīng)用場景是通過事件來定期的調(diào)用存儲過程,下面是一個(gè)簡單的示例:
創(chuàng)建一個(gè)讓test表的id2字段每行加基數(shù)2的存儲過程,存儲過程代碼如下:
DROP PROCEDURE IF EXISTS test_add;
DELIMITER //
CREATE PROCEDURE test_add()
BEGIN
DECLARE 1_id INT DEFAULT 1;
DECLARE 1_id2 INT DEFAULT 0;
DECLARE error_status INT DEFAULT 0;
DECLARE datas CURSOR? FOR SELECT id FROM test;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET error_status=1;
OPEN datas;
FETCH datas INTO 1_id;
REPEAT
SET? 1_id2=1_id2+2;
UPDATE test SET id2=1_id2 WHERE id=1_id;
FETCH datas INTO 1_id;
UNTIL? error_status
END REPEAT;
CLOSE? datas;
END
//
事件設(shè)置2012-08-22 00:00:00時(shí)刻開始運(yùn)行,每隔1調(diào)用一次存儲過程,40天后結(jié)束,代碼如下:
CREATE EVENT test ON SCHEDULE EVERY 1 DAY
STARTS '2012-08-22 00:00:00'
ENDS '2012-08-22 00:00:00'+INTERVAL 40 DAY
ON COMPLETION PRESERVE DO
CALL test_add();
?
四、??? 參考鏈接
http://dev.mysql.com/doc/refman/5.1/en/events-configuration.html
http://dev.mysql.com/doc/refman/5.1/en/create-event.html
http://blog.163.com/duanpeng3@126/blog/static/8854373520105182123112/
?
轉(zhuǎn)載于:https://www.cnblogs.com/feihongwuhen/archive/2012/08/23/7169799.html
總結(jié)
- 上一篇: Streams那些事之概述与原理
- 下一篇: 文件上传插件