--作者:飞翔的小胖猪
--创建时间:2021年2月26日
前言
mysql中设置定时任务,需要先打开调度才能实现自动执行任务。调度功能开启后过再配合存储过程或事件等组件实现特定或定时的任务实现。
步骤
1 开启事件调度功能,基于全局和配置文件。
2 编写相关需要执行的动作,可通过两种方式实现。
2.1 基于存储过程调用动作编写事件
2.2 直接使用事件自带的定时功能
一 、操作
1.1 开启调度
开启调度功能需要在当前数据库系统设置,并添加到配置文件中。调度开启后请再次使用命令查看确认调度是否开启。
确认调度状态
-- 查询方法,任选其一即可。 mysql> SHOW VARIABLES LIKE 'event_scheduler'; mysql> SELECT @@event_scheduler;
系统中开启
-- 设置方法(开启),以下命令任选其一。 mysql> SET @@global.event_scheduler = ON;
mysql> SET GLOBAL event_scheduler = ON;
mysql> SET GLOBAL event_scheduler = 1;
mysql> SET @@global.event_scheduler = 1;
-- 设置方法(关闭) mysql> SET @@global.event_scheduler = OFF;
mysql> SET GLOBAL event_scheduler = OFF;
mysql> SET GLOBAL event_scheduler = 0;
mysql> SET @@global.event_scheduler = 0
添加配置文件
在/etc/my.cnf文件中添加内容,注意需要添加到[mysqld]下。
[root@136-b ~]# cat /etc/my.cnf [mysqld] event_scheduler = 1
1.2 编写任务
基于存储过程
基于存储过程的方式需要先定义一个存储过程通过这个存储过程去调用其他的动作如事件。
DELIMITER $$ USE `database`$$ DROP PROCEDURE IF EXISTS `auto_del_90`$$ CREATE DEFINER=`root`@`%` PROCEDURE `auto_del_90`() BEGIN DELETE FROM basetb WHERE DATE(发生时间) <= DATE(DATE_SUB(NOW(),INTERVAL 90 DAY)); END$$ DELIMITER ;
直接使用事件
直接使用事件自带的事件计数器完成定时任务的执行操作,此时不需要设置存储过程。
DELIMITER $$ DROP EVENT IF EXISTS deleteLog; CREATE EVENT deleteLog ON SCHEDULE EVERY 60 SECOND ON COMPLETION PRESERVE DO BEGIN delete from check_host_web_status where resource_id like 'app%' and inspection_date<=now()-interval 300 second; END$$ DELIMITER ;
解释:
第一行:设置结束符为 $$ 第二行:删除名为deteLog的事件,防止冲突。 第三行:创建一个名为deleteLog的事件,名字区分大小写。 第四行:设置事件的调度间隔事件单位有:YEAR,MONTH,DAY,HOUR,MINUTE 或者SECOND 第五行: 设置事件执行过后的动作,默认事件执行一次后会删除,周期性任务必须保存。参数:PRESERVE(保存)、NOT PRESERVE(不保存) 第六行:动作开始行标识 第七行:具体执行语句 第八行:动作结束行标识 第九行:设置语句结束符为 ;
1.3 事件常见操作
查看事件
mysql > select db,name,interval_value,interval_field,last_executed,status,time_zone from mysql.event;
禁/启用事件
--禁用对应的事件
mysql> ALTER EVENT deleteLog DISABLE;
--启用对应的事件
mysql> ALTER EVENT deleteLog ENABLED;
删除事件
mysql> DROP EVENT [IF EXISTS] event_name;
参考文档:http://c.biancheng.net/view/7703.html https://www.cnblogs.com/qqhfeng/p/12532689.html