1、介绍
事件调度器是在 MySQL 5.1 中新增的另外一个特点功能,能够做为定时任务调度器,取代部分原先只能用操做系统任务调度器才能完成的定时功能。并且 MySQL 的事件调度器能够实现每秒钟执行一个任务,这在一些对实时性要求较高的环境下就很是实用了。mysql
事件调度器是定时触发执行的,在这个角度上也能够称做是”临时的触发器”。触发器只是针对某个表产生的事件执行一些语句,而事件调度器则是在某一个 (间隔)时间执行一些语句。事件是由一个特定的线程来管理的,也就是所谓的”事件调度器”。启用事件调度器后,拥有 SUPER 权限的帐户执行 SHOW PROCESSLIST 就能够看到这个线程了。经过设定全局变量event_scheduler 的值便可动态的控制事件调度器是否启用。sql
在使用这个功能以前必须确保event_scheduler已开启,可执行服务器
1 |
SET GLOBAL event_scheduler = 1; |
或spa
1 |
SET GLOBAL event_scheduler = ON ; |
来开启,也能够直接在启动命令加上“–event_scheduler=1”,例如:操作系统
1 |
mysqld ... --event_scheduler=1 |
要查看当前是否已开启事件调度器,可执行以下SQL:线程
1 |
SHOW VARIABLES LIKE 'event_scheduler' ; |
或code
1 |
SELECT @@event_scheduler; |
2、建立事件(CREATE EVENT)
先来看一下它的语法:对象
1 |
CREATE EVENT [IF NOT EXISTS] event_name |
3 |
[ ON COMPLETION [ NOT ] PRESERVE] |
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}it
1) 首先来看一个简单的例子来演示每秒插入一条记录到数据表
2 |
CREATE TABLE aaa (timeline TIMESTAMP ); |
3 |
CREATE EVENT e_test_insert |
4 |
ON SCHEDULE EVERY 1 SECOND |
5 |
DO INSERT INTO test.aaa VALUES ( CURRENT_TIMESTAMP ); |
等待3秒钟后,再执行查询看看:
+———————+
| timeline |
+———————+
| 2007-07-18 20:44:26 |
| 2007-07-18 20:44:27 |
| 2007-07-18 20:44:28 |
+———————+
2) 5天后清空test表:
2 |
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 5 DAY |
3 |
DO TRUNCATE TABLE test.aaa; |
3) 2007年7月20日12点整清空test表:
2 |
ON SCHEDULE AT TIMESTAMP '2007-07-20 12:00:00' |
3 |
DO TRUNCATE TABLE test.aaa; |
4) 天天定时清空test表:
2 |
ON SCHEDULE EVERY 1 DAY |
3 |
DO TRUNCATE TABLE test.aaa; |
5) 5天后开启天天定时清空test表:
2 |
ON SCHEDULE EVERY 1 DAY |
3 |
STARTS CURRENT_TIMESTAMP + INTERVAL 5 DAY |
4 |
DO TRUNCATE TABLE test.aaa; |
6) 天天定时清空test表,5天后中止执行:
2 |
ON SCHEDULE EVERY 1 DAY |
3 |
ENDS CURRENT_TIMESTAMP + INTERVAL 5 DAY |
4 |
DO TRUNCATE TABLE test.aaa; |
7) 5天后开启天天定时清空test表,一个月后中止执行:
2 |
ON SCHEDULE EVERY 1 DAY |
3 |
STARTS CURRENT_TIMESTAMP + INTERVAL 5 DAY |
4 |
ENDS CURRENT_TIMESTAMP + INTERVAL 1 MONTH |
5 |
DO TRUNCATE TABLE test.aaa; |
[ON COMPLETION [NOT] PRESERVE]能够设置这个事件是执行一次仍是持久执行,默认为NOT PRESERVE。
8 ) 天天定时清空test表(只执行一次,任务完成后就终止该事件):
2 |
ON SCHEDULE EVERY 1 DAY |
3 |
ON COMPLETION NOT PRESERVE |
4 |
DO TRUNCATE TABLE test.aaa; |
[ENABLE | DISABLE]但是设置该事件建立后状态是否开启或关闭,默认为ENABLE。 [COMMENT 'comment']能够给该事件加上注释。
3、修改事件(ALTER EVENT)
ALTER EVENT event_name
[ON SCHEDULE schedule]
[RENAME TO new_event_name]
[ON COMPLETION [NOT] PRESERVE]
[COMMENT 'comment']
[ENABLE | DISABLE]
[DO sql_statement]
1) 临时关闭事件
1 |
ALTER EVENT e_test DISABLE; |
2) 开启事件
1 |
ALTER EVENT e_test ENABLE; |
3) 将天天清空test表改成5天清空一次:
2 |
ON SCHEDULE EVERY 5 DAY ; |
4、删除事件(DROP EVENT)
语法很简单,以下所示:
1 |
DROP EVENT [IF EXISTS] event_name |
例如删除前面建立的e_test事件
固然前提是这个事件存在,不然会产生ERROR 1513 (HY000): Unknown event错误,所以最好加上IF EXISTS
DROP EVENT IF EXISTS e_test;
5、后续
该特性确实很是有用,可做为定时清空数据表、监控主从服务器、汇总数据到另外一张表等等,而且能够精确到每秒,实时性也能够获得保障。除了调度SQL语句以外,MYSQL的调度器也能够调度存储过程。
不过若是当两个事件的针对相同的对象的时候,会出现冲突,这种状况还不明确是我理解的问题仍是确实是这样,好比每秒插入和定时删除就会冲突。