MySQL数据库之定时器
偶尔会用到类似于让数据库自动完成一些数据的操作之类的动作,之前的思路一直是写个WinForm的程序定时运行,这样是灵活些,但是如果只是单个数据库内部的一些数据操作的时候,这样做就有点浪费了,所以用数据库自身的定时执行机制相对会更好一些。
比如:
- 定时清理数据
- 在每月的月底统计这个月的业务,将统计后的值放入统计表中
- 分段定时导出批量数据,进行数据迁移
- 定时整理其他系统推送来的数据,然后将整理后的数据放入本系统业务表中
-- 开启事件调度器
SET GLOBAL event_scheduler = ON;
-- 关闭事件调度器
SET GLOBAL event_scheduler = OFF;
-- 查看事件调度器状态
SHOW VARIABLES LIKE 'event_scheduler';
永久解决办法:
找到mysql根目录下my.ini文件,打开并在[mysqld]标记下方添加一句
event_scheduler = ON
即可。
注意: 不要添加到[mysql]标记下,而是[mysqld]标记下,不然会配置无效。
重启mysql 之后就会永久生效
创建
创建名称为e_autoTotal的事件,用于在每个月的第一天凌晨1点调用存储过程。
CREATE EVENT IF NOT EXISTS e_autoTotal
ON SCHEDULE EVERY 1 MONTH STARTS DATE_ADD(DATE_ADD(DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE())-1 DAY),INTERVAL 1 MONTH),INTERVAL 1 HOUR)
ON COMPLETION PRESERVE ENABLE
DO CALL
insert into tb_test1 select * from tb_test_2;
修改
AlTER EVENT IF NOT EXISTS e_autoTotal
ON SCHEDULE EVERY 1 MONTH STARTS DATE_ADD(DATE_ADD(DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE())-1 DAY),INTERVAL 1 MONTH),INTERVAL 1 HOUR)
ON COMPLETION PRESERVE ENABLE
DO CALL
insert into tb_test1 select * from tb_test_2;
启动与关闭
示例:启动名称为event_user的事件。
ALTER EVENT event_user ENABLE;
示例:关闭名称为event_user的事件。
ALTER EVENT event_user DISABLE;
删除
删除名称为event_user的事件。
DROP EVENT IF EXISTS event_user;
一些常用的时间间隔设置:
(1)每隔5秒钟执行
ON SCHEDULE EVERY 5 SECOND
(2)每隔1分钟执行
ON SCHEDULE EVERY 1 MINUTE
(3)每天凌晨1点执行
ON SCHEDULE EVERY 1 DAY STARTS DATE_ADD(DATE_ADD(CURDATE(), INTERVAL 1 DAY), INTERVAL 1 HOUR)
(4)每个月的第一天凌晨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)
(5)每 3 个月,从现在起一周后开始
ON SCHEDULE EVERY 3 MONTH STARTS CURRENT_TIMESTAMP + 1 WEEK
(6)每十二个小时,从现在起三十分钟后开始,并于现在起四个星期后结束
ON SCHEDULE EVERY 12 HOUR STARTS CURRENT_TIMESTAMP + INTERVAL 30 MINUTE ENDS CURRENT_TIMESTAMP + INTERVAL 4 WEEK
查询系统中的定时器
在MySQL中可以通过查询information_schema.events表,查看已创建的事件。其语句如下:
SELECT * FROM information_schema.events;
下一篇:
MySQL 数据库操作
MySQL 数据库操作