您的位置:首页 > 数据库 > MySQL

Mysql定时执行任务实现方法

2017-09-11 11:03 696 查看
在开发过程中经常会遇到这样一个问题:

每天必须定时去执行一条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事件语法格式:

[sql] view
plain copy

 print?

<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

[sql] view
plain copy

 print?

set time_zone = '+8:00';  

set GLOBAL event_scheduler = 1;  

  

-- 设置该事件使用或所属的数据库base数据库  

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  

  

  

-- do something 编写你的计划任务要做的事  

    INSERT aaa VALUES (3,'222');  

    INSERT aaa VALUES (2,'222');  

  

-- 结束计划任务  

end $$  

  

# 将语句分割符设置回 ';'  

DELIMITER ;  

4、查询事件的运行状态

修改事件语法格式:

[sql] view
plain copy

 print?

ALTER EVENT event_name  

[ON SCHEDULE schedule]  

[RENAME TO new_event_name]  

[ON COMPLETION [NOT] PRESERVE]  

[COMMENT 'comment']  

[ENABLE | DISABLE]  

[DO sql_statement]  

5、关闭\打开事件:

[sql] view
plain copy

 print?

关闭事件:  

ALTER EVENT upload_to_sdmp DISABLE;  

[sql] view
plain copy

 print?

开启事件:  

ALTER EVENT upload_to_sdmp ENABLE;    

6、查询事件是否开启

[sql] view
plain copy

 print?

select * from mysql.event  

注意:真实的开发环境中,会遇到mysql服务重启或者断电的情况,此时则会出现事件调度器被关闭的情况,所有事件都不在起作用,要想解决这个办法,则需要在mysql.ini文件中加入event_scheduler = ON; 的语句

 
设置event很简单,但是麻烦的是如何设置执行的时间,网上找了一些,自己总结了一下。先看语句,如下面这个
CREATE EVENT test_event
ON SCHEDULE EVERY
1 DAY STARTS
'2012-09-24 00:00:00'
ON COMPLETION PRESERVE ENABLE
DO
CALL test_procedure();EVERY 后面的是时间间隔,可以选 1 second,3 minute,5 hour,9 day,1 month,1 quarter(季度),1 year 从2013年1月13号0点开始,每天运行一次ON
SCHEDULE EVERY 1 DAY STARTS '2013-01-13 00:00:00'从现在开始每隔九天定时执行ON SCHEDULE EVERY 9 DAY STARTS NOW() ;每个月的一号凌晨1 点执行on schedule every 1 month starts date_add(date_add(date_sub(curdate(),interval day(curdate())-1 day),interval 1 month),interval 1 hour);每个季度一号的凌晨1点执行on
schedule every 1 quarter starts date_add(date_add(date(concat(year(curdate()),'-',elt(quarter(curdate()),1,4,7,10),'-',1)),interval 1 quarter),interval 1 hour);每年1月1号凌晨1点执行on schedule every 1 quarter starts date_add(date_add(date(concat(year(curdate()),'-',elt(quarter(curdate()),1,4,7,10),'-',1)),interval
1 quarter),interval 1 hour);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: