事件调度器是MySQL5.1后新增的功能,可以将数据库按自定义的时间周期触发某种操作,可以理解为时间触发器,类似于<a href="http://www.php.cn/wiki/1497.html" target="_blank">linux</a>系统下面的任务调度器crontab,或者类似与window下面的计划任务
。值得一提的是MySQL的事件调度器可以精确到每秒钟执行一个任务,而操作系统的计划任务(如:Linux下的CRON或Windows下的任务计划)只能精确到每分钟执行一次。
在使用事件这个功能,首先要保证你的mysql的版本是5.1以上,然后还要查看你的mysql服务器上的事件是否开启。
查看事件是否开启,使用如下命令查看:
#方式一 SHOW VARIABLES LIKE 'event_scheduler'; #方式二 SELECT @@event_scheduler; #方式三 SHOW PROCESSLIST; #查看事件状态 SHOW EVENTS;
如果看到event_scheduler为on或者PROCESSLIST中显示有event_scheduler的信息说明就已经开启了事件。如果显示为off或者在PROCESSLIST中查看不到event_scheduler的信息,那么就说明事件没有开启,我们需要开启它。
方式一、通过动态参数修改
SET GLOBAL event_scheduler = ON;
更改完这个参数就立刻生效了,但是重启mysql又还原了,即设置不能跨重启。
方式二、更改配置文件然后重启
在my.cnf中的[mysqld]部分添加如下内容,然后重启mysql。
event_scheduler=ON;
一劳永逸,需要能够修改数据库配置的权限。
方式三、直接在启动命令加上“–event_scheduler=1”
mysqld ... --event_scheduler=ON
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}
DEFINER: 定义事件执行的时候检查权限的用户。
ON SCHEDULE schedule: 定义执行的时间和时间间隔。
ON COMPLETION [NOT] PRESERVE: 定义事件是一次执行还是永久执行,默认为一次执行,即NOT PRESERVE。
ENABLE | DISABLE | DISABLE ON SLAVE: 定义事件创建以后是开启还是关闭,以及在从上关闭。如果是从服务器自动同步主上的创建事件的语句的话,会自动加上DISABLE ON SLAVE。
COMMENT 'comment': 定义事件的注释。
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]
DROP EVENT [IF EXISTS] event_name;
举例一
定时每隔3秒向表test2中插入数据
create event event_insert_t2 on schedule every 3 second on completion preserve do insert into test2(department,time_v) value('1',now());
执行结果
举例二
创建一个10分钟后清空test表数据的事件
CREATE EVENT IF NOT EXISTS event_truncate_test2 ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 10 MINUTE DO TRUNCATE TABLE test2;
举例三
创建一个在2015-04-17 14:42:00时刻清空test表数据的事件
DROP EVENT IF EXISTS event_truncate_test2; CREATE EVENT event_truncate_test2 ON SCHEDULE AT TIMESTAMP '2015-04-17 14:42:00' DO TRUNCATE TABLE test2;
举例四
5天后开启每天定时3秒向表test2中插入数据,一个月后停止执行
CREATE EVENT IF NOT EXISTS event_truncate_test2 ON SCHEDULE EVERY 3 SECOND STARTS CURRENT_TIMESTAMP + INTERVAL 5 day ENDS CURRENT_TIMESTAMP + INTERVAL 1 month ON COMPLETION PRESERVE DO INSERT INTO test2(department,time_v) VALUES('1',NOW());
举例一
临时关闭事件
alter event event_insert_t2 disable;
其他类似创建事件。
DROP EVENT IF EXISTS event_insert_t2;
优点
定时任务由dba统一管理,避免部署在操作系统层。
减少系统管理员产生误操作的风险。
有利于后续的管理和维护。
缺点
在繁忙且要求性能的数据库上慎重部署和启用调度器。
过于复杂的处理更适合使用程序实现。
开启和关闭事件需要具有超级用户权限。
应用场景
适用于定期收集统计信息,定期清除历史数据,定期数据库检查等等。
【相关推荐】
2. MySQL最新手册教程
以上是详解MySQL新增的功能(事件调度器)实例的详细内容。更多信息请关注PHP中文网其他相关文章!