MySQL 从 5.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_scheduler 为 OFF 时用以下命令开启:
1 | set global event_scheduler=1; |
以上的改法在数据库重启后将会恢复为原来状态,要想数据库重启后也可以让 event_scheduler 开启,则需要在配置文件 my.ini
的设置。修改如下,然后重启 MySQL 服务即可:
1 | [mysqld] |
创建定时任务 event ( 事件 )
1 | create event second_event |
代码说明:
- 第一行 create event day_event 是创建名为 second_event 的事件,注意此处没有括号;
- 第二行是创建周期定时的规则,本处的意思是每秒钟执行一次;
- 第三行 on completion preserve disable 是表示创建后并不开始生效;
- 第四行 do call test_proce() 是该 event(事件) 的操作内容,表示调用我们刚刚创建的 test_proce() 存储过程。
查看定时任务 event ( 事件 )
查看本机所有的事件:
1 | SELECT event_name,event_definition,interval_value,interval_field,status FROM information_schema.EVENTS; |
开启已经创建好的 event ( 事件 )
1 | alter event second_event on completion preserve enable;//开启定时任务 |
常见周期定时规则
① 周期执行 – 关键字 EVERY
单位有:second, minute, hour, day, week(周), quarter(季度), month, year,如:
1 | on schedule every 1 second //每秒执行1次 |
② 在具体某个时间执行 – 关键字 AT, 如:
1 | on schedule at current_timestamp()+interval 5 day // 5天后执行 |
③ 在某个时间段执行 – 关键字 STARTS ENDS, 如:
1 | on schedule every 1 day starts current_timestamp()+interval 5 day ends current_timestamp()+interval 1 month // 5天后开始每天都执行执行到下个月底 |