一、前言
自MySQL5.1.6起,增加了一个非常有特色的功能–事件调度器(Event Scheduler),可以用做定时执行某些特定任务(例如:删除记录、对数据进行汇总等等),来取代原先只能由操作系统的计划任务来执行的工作。更值得一提的是MySQL的事件调度器可以精确到每秒钟执行一个任务,而操作系统的计划任务(如:Linux下的CRON或Windows下的任务计划)只能精确到每分钟执行一次。对于一些对数据实时性要求比较高的应用(例如:股票、赔率、比分等)就非常适合。
事件调度器有时也可称为临时触发器(temporal triggers),因为事件调度器是基于特定时间周期触发来执行某些任务,而触发器(Triggers)是基于某个表所产生的事件触发的,区别也就在这里。
实例一:
显示存储过程:show procedure status;
删除存储过程:drop procedure proc_name; // proc_name 存储过程名称
查看event是否开启: show variables like '%sche%';
将事件计划开启: set global event_scheduler=1; 或set global event_scheduler=ON;
关闭事件任务: alter event e_update_loginout_time ON COMPLETION PRESERVE DISABLE;
开户事件任务: alter event e_update_loginout_time ON COMPLETION PRESERVE ENABLE;
将事件计划开启: set global event_scheduler=1; 或set global event_scheduler=ON;
关闭事件任务: alter event e_update_loginout_time ON COMPLETION PRESERVE DISABLE;
开户事件任务: alter event e_update_loginout_time ON COMPLETION PRESERVE ENABLE;
定义存储过程update_loginout_time
delimiter //
CREATE PROCEDURE update_loginout_time ()
BEGIN
update tbl_user_role SET logoutTime = now() where roleId = 1029;
END;
//
创建event e_update_loginout_time
CREATE EVENT if not exists e_update_loginout_time
on schedule every 60 second
on completion preserve
do call update_loginout_time();
每隔60秒将执行存储过程update_loginout_time,将当前时间更新到tbl_user_role表中roleId = 1029的记录的logoutTime字段中去(登出时间).
delimiter //
CREATE PROCEDURE update_loginout_time ()
BEGIN
update tbl_user_role SET logoutTime = now() where roleId = 1029;
END;
//
创建event e_update_loginout_time
CREATE EVENT if not exists e_update_loginout_time
on schedule every 60 second
on completion preserve
do call update_loginout_time();
每隔60秒将执行存储过程update_loginout_time,将当前时间更新到tbl_user_role表中roleId = 1029的记录的logoutTime字段中去(登出时间).
实例二:
/** 查看event是否开启 */
show variables like '%sche%';
/** 将事件计划开启 set global event_scheduler=1;*/
set global event_scheduler=ON;
/** 定义存储过程,删除行为日志*/
delimiter //
CREATE PROCEDURE delete_action_log (in date_inter integer)
BEGIN
DELETE from tbl_Log_action where TO_DAYS(SYSDATE()) - TO_DAYS(createDate) > date_inter;
END;
//
/** 创建操作event事件,从2015-03-17凌晨2点50操作删除6天前日志,每日循环执行 */
CREATE EVENT if not exists e_delete_action_log
on schedule every 1 DAY STARTS '2015-03-17 02:50:00'
on completion preserve enable
do call delete_action_log(60);
show variables like '%sche%';
/** 将事件计划开启 set global event_scheduler=1;*/
set global event_scheduler=ON;
/** 定义存储过程,删除行为日志*/
delimiter //
CREATE PROCEDURE delete_action_log (in date_inter integer)
BEGIN
DELETE from tbl_Log_action where TO_DAYS(SYSDATE()) - TO_DAYS(createDate) > date_inter;
END;
//
/** 创建操作event事件,从2015-03-17凌晨2点50操作删除6天前日志,每日循环执行 */
CREATE EVENT if not exists e_delete_action_log
on schedule every 1 DAY STARTS '2015-03-17 02:50:00'
on completion preserve enable
do call delete_action_log(60);