MySQL之事件調度器簡單應用
阿新 • • 發佈:2018-09-15
關閉 mode fault .com 存儲 unicode for rom 來看 一.MySQL之事件調度器語法詳解
創建,修改,查看等語法參考官網文檔鏈接,http://dev.mysql.com/doc/refman/5.6/en/create-event.html
創建事件(CREATE EVENT)
先來看一下它的語法:
CREATE EVENT [IF NOT EXISTS] event_name ON SCHEDULE schedule [ON COMPLETION [NOT] PRESERVE] [ENABLE | DISABLE] [COMMENT ‘comment‘] DO sql_statement; schedule: AT TIMESTAMP [+ INTERVAL INTERVAL] | EVERY INTERVAL [STARTS TIMESTAMP] [ENDS TIMESTAMP] INTERVAL: quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE | DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
詳細解析:
①definer:指明該event的用戶,服務器在執行該事件時,使用該用戶來檢查權限。 默認用戶為當前用戶,即definer = current_user; 如果明確指明了definer,則必須遵循如下規則: 1.如果沒有super權限,唯一允許的值就是自己當前用戶,而不能設置為其他用戶。 2.如果具有super權限,則可以指定任意存在的用戶;如果指定的用戶不存在,則事件在執行時會報錯。 ②if not exists:如果事件已經存在,則不會創建,也不會報錯。 ③on schedule子句:指定何時執行該事件,以及如何執行該事件 1)at timestamp用於創建單次執行的事件,timestamp執行事件執行的時間(如果指定的時間是過去的時間,則會產生一個warning),時間可以是具體的時間字符串或者是一個datetime類型的表達式(如current_timestamp): 如果要指定將來某個時間,直接使用at timestamp,例:at ‘2017-08-08 08:08:08‘; 如果要指定將來某個時間間隔,可利用interval關鍵字(interval關鍵字可以進行組合,at timestamp + INTERVAL 2 HOUR、 + INTERVAL 30 MINUTE) 2)every子句用於創建重復執行的事件,如果每分鐘執行一次,則可以:EVERY 1 MINUTE。 當然,every子句可以指定一個開始時間和結束時間,通過STARTS和ENDS關鍵字來表示,具體語法與前面類似 例如:EVERY 12 HOUR STARTS CURRENT_TIMESTAMP + INTERVAL 30 MINUTE ENDS CURRENT_TIMESTAMP + INTERVAL 4 WEEK。 ④通常情況下,如果一個事件已過期,則會被立即刪除。但是,create event定義中通過on completion preserve子句可以保留已過期的時間。 默認:ON COMPLETION NOT PRESERVE,也就是不保存 ⑤默認情況下,enable on slave,事件一旦創建後就立即開始執行;可以通過disable關鍵字來禁用該事件。 ⑦do子句用於指示事件需要執行的操作,可以是一條SQL語句,也可以是被begin...end包括的語句塊,也可以在語句塊中調用存儲過程。
基本格式:
CREATE EVENT event_name
ON SCHEDULE <schedule>
DO <event_body>;
實例一:
首先來看一個簡單的例子:
創建測試表:
CREATE TABLE `test1_event` ( `id` int(8) NOT NULL AUTO_INCREMENT, `username` varchar(20) COLLATE utf8_unicode_ci NOT NULL, `password` varchar(20) COLLATE utf8_unicode_ci NOT NULL, `create_time` varchar(20) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`id`) #主鍵ID ) ENGINE=innodb AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
創建一個定時器 event_1 :
當前時間2分鐘後開啟每10秒插入一條記錄到表test1_event
CREATE EVENT event_1
ON SCHEDULE EVERY 10 SECOND
STARTS CURRENT_TIMESTAMP + INTERVAL 2 MINUTE
DO insert into test.test1_event(username,password,create_time) values ("李四","tomcat",now());
mysql> select * from test1_event;
+----+----------+----------+---------------------+
| id | username | password | create_time |
+----+----------+----------+---------------------+
| 1 | 李四 | tomcat | 2018-09-14 20:49:55 |
| 2 | 李四 | tomcat | 2018-09-14 20:50:05 |
| 3 | 李四 | tomcat | 2018-09-14 20:50:15 |
| 4 | 李四 | tomcat | 2018-09-14 20:50:25 |
| 5 | 李四 | tomcat | 2018-09-14 20:50:35 |
| 6 | 李四 | tomcat | 2018-09-14 20:50:45 |
| 7 | 李四 | tomcat | 2018-09-14 20:50:55 |
+----+----------+----------+---------------------+
7 rows in set (0.00 sec)
創建一個定時器 event_2:
當前時間1分鐘後開啟每5秒插入一條記錄到表test2_event
delimiter $$
create event event_2
on schedule every 5 second STARTS CURRENT_TIMESTAMP + INTERVAL 1 MINUTE
COMMENT ‘xiaowu create‘
do
BEGIN
insert into test.test2_event(username,password,create_time) values("李四","tomcat",now());
END $$
delimiter ;
mysql> select * from test2_event;
+-----+----------+----------+---------------------+
| id | username | password | create_time |
+-----+----------+----------+---------------------+
| 1 | 李四 | tomcat | 2018-09-14 20:50:06 |
| 2 | 李四 | tomcat | 2018-09-14 20:50:11 |
| 3 | 李四 | tomcat | 2018-09-14 20:50:16 |
| 4 | 李四 | tomcat | 2018-09-14 20:50:21 |
| 5 | 李四 | tomcat | 2018-09-14 20:50:26 |
| 6 | 李四 | tomcat | 2018-09-14 20:50:31 |
| 7 | 李四 | tomcat | 2018-09-14 20:50:36 |
+-----+----------+----------+---------------------+
213 rows in set (0.00 sec)
查看事件:
show events;
查看event的狀態信息:
mysql> select * from information_schema.events limit 2,3\G
*************************** 1. row ***************************
EVENT_CATALOG: def
EVENT_SCHEMA: test
EVENT_NAME: event_2
DEFINER: root@localhost
TIME_ZONE: SYSTEM
EVENT_BODY: SQL
EVENT_DEFINITION: BEGIN
insert into test.test2_event(username,password,create_time) values("李四","tomcat",now());
END
EVENT_TYPE: RECURRING
EXECUTE_AT: NULL
INTERVAL_VALUE: 5
INTERVAL_FIELD: SECOND
SQL_MODE: STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
STARTS: 2018-09-14 20:50:06
ENDS: NULL
STATUS: ENABLED
ON_COMPLETION: NOT PRESERVE
CREATED: 2018-09-14 20:48:06
LAST_ALTERED: 2018-09-14 20:48:06
LAST_EXECUTED: 2018-09-14 21:01:01
EVENT_COMMENT: xiaowu create
ORIGINATOR: 1131053306
CHARACTER_SET_CLIENT: utf8
COLLATION_CONNECTION: utf8_general_ci
DATABASE_COLLATION: utf8_general_ci
*************************** 2. row ***************************
EVENT_CATALOG: def
EVENT_SCHEMA: test
EVENT_NAME: event_1
DEFINER: root@localhost
TIME_ZONE: SYSTEM
EVENT_BODY: SQL
EVENT_DEFINITION: insert into test.test1_event(username,password,create_time) values ("李四","tomcat",now())
EVENT_TYPE: RECURRING
EXECUTE_AT: NULL
INTERVAL_VALUE: 10
INTERVAL_FIELD: SECOND
SQL_MODE: STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
STARTS: 2018-09-14 20:49:55
ENDS: NULL
STATUS: DISABLED
ON_COMPLETION: NOT PRESERVE
CREATED: 2018-09-14 20:47:55
LAST_ALTERED: 2018-09-14 20:53:15
LAST_EXECUTED: 2018-09-14 20:53:05
EVENT_COMMENT:
ORIGINATOR: 1131053306
CHARACTER_SET_CLIENT: utf8
COLLATION_CONNECTION: utf8_general_ci
DATABASE_COLLATION: utf8_general_ci
2 rows in set (0.00 sec)
mysql>
關閉某個事件:
mysql> alter event event_1 disable;
Query OK, 0 rows affected (0.00 sec)
註意:手動關閉事件後,即使是重啟MySQL,事件是不會重新啟動的,必須登陸執行MySQL alter event event_1 enable; 來開啟事件event_1.
手動開啟某個事件
alter event event_1 enable;
刪除某個事件:
drop event event_1;
實例2:
2分鐘後清空test2_event表:
CREATE EVENT event_4
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 2 MINUTE
DO TRUNCATE TABLE test.test2_event;
表已經被清空了,但是之前的計劃事件每秒插入一條記錄到數據表仍然在繼續執行
mysql> select * from test2_event;
+----+----------+----------+---------------------+
| id | username | password | create_time |
+----+----------+----------+---------------------+
| 1 | 李四 | tomcat | 2018-09-14 21:12:26 |
| 2 | 李四 | tomcat | 2018-09-14 21:12:31 |
| 3 | 李四 | tomcat | 2018-09-14 21:12:36 |
| 4 | 李四 | tomcat | 2018-09-14 21:12:41 |
+----+----------+----------+---------------------+
4 rows in set (0.00 sec)
2018年9月06日17點15整點清空test表:
CREATE EVENT a_test
ON SCHEDULE AT TIMESTAMP ‘2018-09-06 17:10:00‘
DO TRUNCATE TABLE test.aaa;
MySQL之事件調度器簡單應用