Fork me on GitHub

MySQL 中的定时任务

MySQL 5 开启定时任务

最近项目里面的后台需要用到定时任务,而 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 标签下

创建 procedure ( 存储过程 )


什么是 procedure ( 存储过程 ) ?

存储过程?当我听到这个词的时候,以为它是 MySQL 存储数据的一个流程而不是一个名词,但是当我网上了解时,才知道这个词是翻译过来的,原生词为 Procedure, 实际上它的含义就是相当于我们面向对象里的方法或者说是 函数,在它里面可以完成多个 sql 语句的操作,并且可以定义参数传值等,与一般的单条 sql 语句的区别主要在这里,详细了解 点我

创建存储过程

先上一段创建存储过程代码:

1
2
3
4
5
6
7
use test;
delimiter //
create procedure test_proce()
begin
insert into weuse(name,created_at,updated_at) values('hello',now(),now());
end//
delimiter ;

enter image description here

上面的代码说明:

(1). use test; : 这个谁都知道,使用某个数据库,这里要强调的是存储过程一定是对于某个数据库而言的,所以必须要选中一个数据库才能创建成功。

(2). delimiter // : 这个是将 MySQL 中以 ;(分号) 结尾的规定修改为以 //(双斜杠) 为语句结束符,因为存储过程里可以有多条 sql 语句,里面的 sql 语句都以 ; 号结尾,如果回车了那么系统会当做 sql 语句直接执行了,我们希望的是先定义这一系列 sql 语句而先不执行,所以要改下操作结束符。当然你在改后一定要改回来,大家可以看到最后一行有对应的修改回来的语句。

(3). 下面所示的语句则是一起输入的,可以知道分别是创建存储过程 test_proce(), 名称可以随便起的,然后是在 begin --end 之间是定义一系列 sql 语句的就可以了,记住最后 end 结尾要以之前修改后的结尾符 // 结束。

1
2
3
4
create procedure test_proce()
begin
insert into weuse(name,created_at,updated_at) values('hello',now(),now());
end//

创建定时任务


上面创建存储过程实际上是为 定时任务 做铺垫的,因为上面只说明了怎么创建存储过程,但是未说明怎么调用,那这里就用到了调用存储过程了。

创建定时任务 event ( 事件 )

依旧先上创建定时任务事件代码:

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

enter image description here

代码说明:

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

查看定时任务 event ( 事件 )

查看本机所有的事件:

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

enter image description here

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

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

当我们用第一句命令开启定时任务时,可以就可以查看数据库情况,已经实现了 每秒钟执行一次 了,如图:

enter image description here

要想关闭定时任务只要执行上面的第二句命令,关闭需要关闭的定时任务就可以了。

常见周期定时规则

① 周期执行 – 关键字 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' // 在2016年10月1日,晚上9点50执行

③ 在某个时间段执行 – 关键字 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天

效率工具


MysqlWorkBench

是官方推荐的免费可视化 MySQL 操作工具,方便建模,ER 图操作,经我发现好像只能可视化操作存储过程,没看到有定时任务的 ( 也可能是自己没找到 )。

存储过程示例如下:

enter image description here

对于 Event 事件,可以查看,用 sql 命令

1
2
SELECT * FROM information_schema.EVENTS;	// 查看所有事件属性
SELECT event_name,event_definition,interval_value,interval_field,status FROM information_schema.EVENTS; // 查看主要几个属性

enter image description here

这个是收费的软件,但是可视化操作比较轻量级,功能也很多,它可以可视化操作存储过程和Event 事件,详细操作大家可以自己摸索啊!!

enter image description here

苟且一下