0%

MySQL定时任务(EVENT)

MySQL5.0 开始自带了定时事件操作。

后台周期定时任务可以有多种解决方案,我所知道的大概有以下几种:

(1). 后台框架自带定时任务。比如 Php 中的 Laravel 框架里有提供定时任务操作接口,其他的框架大家可以单独针对了解。

(2). 服务器操作系统层面的定时。通常我们的服务器主要基于两大平台,一个 Windows Server, 它的定时任务系统有提供的。Linux 下也有,通常流行的是 crontab 工具实现的 ( 想了解这里有个 视频教程 ), 但是 crontab 的定时任务通常定时操作脚本这样的文件,而直接定时操作数据库的就比较麻烦了。但是也有解决办法,就是在服务器端写一个 get 请求 url,在后台里完成要定时完成的数据库操作,这样我们只要实现定时访问该接口就行了,Linux 下的 curl 命令可以很方便发出 get 请求,我们只要写个包含访问该接口的脚本,再结合 crontab 就可以完成后台数据的定时更新操作了。

(3). 但是毕竟写个接口安全性不是太高,而大家用的如果是 MySQL 数据库,那就正好可以利用其自带的定时操作了,下面简单介绍 MySQL 定时操作的使用。

Mysql配置

查看定时策略是否开启,查看命令:

1
show variables like '%event_sche%';

显示的 event_schedulerOFF 时用以下命令开启:

1
set global event_scheduler=1;

以上的改法在数据库重启后将会恢复为原来状态,要想数据库重启后也可以让 event_scheduler 开启,则需要在配置文件 my.ini 的设置。修改如下,然后重启 MySQL 服务即可:

1
2
[mysqld]
event_scheduler=ON // 这一行加入 mysqld 标签下

创建定时任务 event ( 事件 )

1
2
3
4
create event second_event
on schedule every 1 second
on completion preserve disable
do call test_proce();

代码说明:

  1. 第一行 create event day_event 是创建名为 second_event 的事件,注意此处没有括号;
  2. 第二行是创建周期定时的规则,本处的意思是每秒钟执行一次;
  3. 第三行 on completion preserve disable 是表示创建后并不开始生效;
  4. 第四行 do call test_proce() 是该 event(事件) 的操作内容,表示调用我们刚刚创建的 test_proce() 存储过程。

查看定时任务 event ( 事件 )

查看本机所有的事件:

1
SELECT event_name,event_definition,interval_value,interval_field,status FROM information_schema.EVENTS;

NWewOr8ABKJTxRk

开启已经创建好的 event ( 事件 )

1
2
alter event second_event on completion preserve enable;//开启定时任务
alter event second_event on completion preserve disable;//关闭定时任务

常见周期定时规则

① 周期执行 – 关键字 EVERY

单位有:second, minute, hour, day, week(周), quarter(季度), month, year,如:

1
2
3
on schedule every 1 second        //每秒执行1
on schedule every 2 minute //每两分钟执行1
on schedule every 3 day //3天执行1

② 在具体某个时间执行 – 关键字 AT, 如:

1
2
3
on schedule at current_timestamp()+interval 5 day    // 5天后执行
on schedule at current_timestamp()+interval 10 minute // 10分钟后执行
on schedule at '2016-10-01 21:50:00' //2016101日,晚上950执行

③ 在某个时间段执行 – 关键字 STARTS ENDS, 如:

1
2
on schedule every 1 day starts current_timestamp()+interval 5 day ends current_timestamp()+interval 1 month // 5天后开始每天都执行执行到下个月底
on schedule every 1 day ends current_timestamp()+interval 5 day //从现在起每天执行,执行5