在开发过程中经常会遇到这样一个问题:
每天必须定时去执行一条sql语句 或更新或删除或执行特定的sql语句。
MySQL的客户端工具Navicat for MySQL提供了计划任务的形式,可以很好地实现该功能,而且也确实可行,比如像定时备份就做的很好。
然而当在执行的语句中包含有中文的时候,却无法定时执行了。
那么就想到用mysql的event计划任务去实现:
要想执行event事件,就必须保证mysql的版本的5.1.6以上,否则会报如下错误:
1、要想保证能够执行event事件,就必须保证定时器是开启状态,默认为关闭状态
set GLOBAL event_scheduler = 1;
或
set GLOBAL event_scheduler = ON;
要查看当前是否已开启事件调度器,可执行如下SQL:
SHOW VARIABLES LIKE 'event_scheduler'
2、
drop event if exist upload_to_sdmp;
3、执行事件
event事件语法格式:
- <pre name="code" class="sql">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}
例如:
-- 设置时区并设置计划事件调度器开启,也可以 event_scheduler = ON
- set time_zone = '+8:00';
- set GLOBAL event_scheduler = 1;
-
-
- use test;
-
- # 如果原来存在该名字的任务计划则先删除
- drop event if exists upload_to_sdmp;
-
- # 设置分隔符为 '$$' ,mysql默认的语句分隔符为 ';' ,这样在后续的 create 到 end 这段代码都会看成是一条语句来执行
- DELIMITER $$
- # 创建计划任务,设置第一次执行时间为'2014-07-30 10:00:00',并且每天执行一次
- create event upload_to_sdmp
- on schedule every 1 day starts timestamp '2014-07-30 10:00:00'
- #on schedule every 1 SECOND
- do
-
- # 开始该计划任务要做的事
- begin
-
-
-
- INSERT aaa VALUES (3,'222');
- INSERT aaa VALUES (2,'222');
-
-
- end $$
-
- # 将语句分割符设置回 ';'
- DELIMITER ;
4、查询事件的运行状态
修改事件语法格式:
- ALTER EVENT event_name
- [ON SCHEDULE schedule]
- [RENAME TO new_event_name]
- [ON COMPLETION [NOT] PRESERVE]
- [COMMENT 'comment']
- [ENABLE | DISABLE]
- [DO sql_statement]
5、关闭\打开事件:
- 关闭事件:
- ALTER EVENT upload_to_sdmp DISABLE;
- 开启事件:
- ALTER EVENT upload_to_sdmp ENABLE;
6、查询事件是否开启
- select * from mysql.event
注意:真实的开发环境中,会遇到mysql服务重启或者断电的情况,此时则会出现事件调度器被关闭的情况,所有事件都不在起作用,要想解决这个办法,则需要在mysql.ini文件中加入event_scheduler = ON; 的语句