合 MySQL中的event(JOB、定时任务)
MySQL5.1.6起增加了事件调度器(Event Scheduler),可用来做定时执行某些特定任务,用于取代原先只能由操作系统的计划任务来执行的工作。MySQL的事件调度器可以精确到每秒执行一个任务,而操作系统的计划任务只能精确到分钟级别。对于对数据实时性要求比较高的应用非常合适。
事件调度器也称为临时触发器(Temporal Triggers),因为事件调度器是基于特定时间周期触发来执行某些任务,而触发器(Triggers)是基于某个表所产生的事件触发的。
MySQL定时任务的实现方式有两种:
- 使用MySQL的
event
定时任务
使用MySQL的事件计划,首先需要在服务器开启event_scheduler
后才能处理。 - 使用Linux的定时任务
crontab
如何开启事件计划呢?
1 2 3 4 5 6 7 | $ SHOW VARIABLES LIKE 'event_scheduler'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | event_scheduler | OFF | +-----------------+-------+ 1 row in set |
如果执行命令后返回值为OFF
则表示目前事件计划是处于关闭的状态。
开启的方式也分为两种,临时方式使用命令行或脚本操作,永久修改则需要修改MySQL主配置文件my.ini
在其中添加event_schduler=1
的配置后重启MySQL。
临时性修改只要不重启MySQL在当前运行状态下会直接生效,一旦重启后则失效。
1 2 3 4 | $ SET GLOBAL event_scheduler = ON; $ SET @@global.event_scheduler = ON; $ SET GLOBAL event_scheduler = 1; $ SET @@global.event_scheduler = 1; |
事件调度器
要保证能够执行事件,就必须保证事件计划是开启状态,事件计划默认为关闭状态。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | # 查看MySQL版本 $ SELECT VERSION(); +------------+ | VERSION() | +------------+ | 5.7.18-log | +------------+ 1 row in set # 事件计划是否开启 $ SHOW VARIABLES LIKE 'event%' $ SHOW VARIABLES LIKE 'event_scheduler'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | event_scheduler | ON | +-----------------+-------+ 1 row in set # 查看事件任务是否开启 $ SELECT @@event_scheduler; +-------------------+ | @@event_scheduler | +-------------------+ | ON | +-------------------+ 1 row in set # 开启事件计划 $ SET GLOBAL event_scheduler=1 $ SET GLOBAL event_scheduler=ON duler=1; Query OK, 0 rows affected # 关闭事件计划 $ SET GLOBAL event_scheduler=0 |
在真实开发环境中会遇到MySQL服务重启或断电的情况,此时会出现事件调度器被关闭的情况。所有事件都不再起作用,解决的方式需要在MySQL的配置文件mysql.ini
中加入event_scheduler=ON
的配置。
事件任务
事件任务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # 查看事件任务 $ SHOW EVENTS; Empty set # 查看事件任务错误 - 权限不足 $ SELECT * FROM mysql.event 1142 - SELECT command denied to user 'username'@'127.0.0.1' for table 'event' # 开启事件任务 $ ALTER EVENT event_name ON COMPLETION PRESERVE ENABLE # 关闭事件任务 $ ALTER EVENT event_name ON COMPLETION PRESERVE DISABLE # 删除事件 $ DROP EVENT [IF EXISTS] event_name |
设置定时任务执行SQL语句
例如:从当日开始每天凌晨4点删除fight表超过一个月的数据
计划任务
1 2 3 4 5 6 7 | DROP EVENT IF EXISTS event_fight_delete; CREATE EVENT event_fight_delete ON SCHEDULE EVERY 1 DAY STARTS DATE_ADD(DATE(CURDATE() + 1), INTERVAL 4 HOUR) DO DELETE FROM center_fight WHERE 1=1 AND createdate < DATE_ADD(CURDATE(), INTERVAL -1 MONTH) ; |
设置定时任务调用存储过程
1 2 3 4 5 6 7 8 9 10 11 | # 若计划任务存在则删除 DROP EVENT IF EXISTS event_name # 创建计划任务 CREATE EVENT event_name ON SCHEDULE EVERY 10 second STARTS TIMESTAMP '2018-07-12 00:00:00' ON COMPLETION PRESERVE DO BEGIN CALL producer() END |
参数说明
ON SCHDULE schduler
定义执行的时间和时间间隔ON COMPLETION [NOT] PRESERVE
定义事件是一次性执行还是永久执行,默认为一次性执行,即NOT PRESERVE
。
在事件中ON SCHEDULE
计划任务中有2种设定的方式
- 用来完成单次计划任务。
1 2 3 4 5 6 7 | AT 时间戳 eg:5天后 AT CURRENT_TIMESTAMP + INTERVAL 5 DAY eg:某时间点 AT TIMESTAMP '2018-07-12 12:00:00' |