回到顶部
您的当前位置: 编程语言> 数据库> MYSQL> 进阶应用
Mysql时间触发器EVENT
2013-11-23 22:38:24
标签: 原创 mysql 定时任务 时间触发器 event

Mysql属于中小型数据库系统,它的事件调度器Event Scheduler是在mysql 5.1才开始引入。事件调度器是在 MySQL 5.1 中新增的另一个特色功能,可以作为定时任务调度器,取代部分原先只能用操作系统任务调度器才能完成的定时功能。事件调度器是定时触发执行的,在这个角度上也可以称作是"临时的触发器"。触发器只是针对某个表产生的事件执行一些语句,而事件调度器则是在某一个(间隔)时间执行一些语句。事件是由一个特定的线程来管理的,也就是所谓的"事件调度器"。

开启event_scheduler(也可以设置为on):
set global event_scheduler = 1;
要查看当前是否已开启事件调度器,可执行如下SQL:
SHOW VARIABLES LIKE 'event_scheduler';
或
SELECT @@event_scheduler;
或
SHOW PROCESSLIST;
创建事件(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}

[ON COMPLETION [NOT] PRESERVE]可以设置这个事件是执行一次还是持久执行,默认为NOT PRESERVE.[ENABLE | DISABLE]可是设置该事件创建后状态是否开启或关闭,默认为ENABLE。

例1:每分钟执行一次:

CREATE EVENT MyEvent  
ON SCHEDULE EVERY 1 MINUTE   
DO (SQL语句)

例2:每天固定时间执行某存储过程:

CREATE EVENT [IF NOT EXISTS] MyEvent  
ON SCHEDULE EVERY 1 DAY   
STARTS TIMESTAMP '2009-12-18 02:58:00' /× 注意时区设置,默认非中国时区 ×/
[ON COMPLETION PRESERVE ENABLE]
DO CALL MyProcedure();

例3:5天后清空test表:

CREATE EVENT e_test
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 5 DAY
DO TRUNCATE TABLE test;

例4:每天定时清空test表,5天后停止执行:

CREATE EVENT e_test
ON SCHEDULE EVERY 1 DAY
ENDS CURRENT_TIMESTAMP + INTERVAL 5 DAY
DO TRUNCATE TABLE test;
修改事件(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:临时关闭事件:

ALTER EVENT e_test DISABLE;

例2:开启事件:

ALTER EVENT e_test ENABLE;

例3:将每天清空test表改为5天清空一次:

ALTER EVENT e_test ON SCHEDULE EVERY 5 DAY;
删除事件(DROP EVENT):
DROP EVENT [IF EXISTS] event_name
特别注意:Mysql定时任务使用过程中,经常会遇到任务没有按预定时间运行的情况,除EVENT本身有问题外,还有可能是Mysql重启的问题(Mysql默认event_scheduler处于关闭状态,每次Mysql重启后,event_scheduler都是关闭的,自然所有EVENT都不执行)。解决方法:1.每次重启后,都运行一次“set global event_scheduler = 1”;2.更改Mysql的my.ini(linux系统为my.cnf)文件,在“[mysqld]”之后追加一行“event_scheduler = 1”(去掉双引号)即可;