关于mysql定时器的相关信息

关于mysql定时器的相关信息

mysql定时器的整理

背景:自己是在短时间内在实战中运用mysql数据库,对于mysql数据库也是个小白,当收到为新建的存储过程建立定时任务,第一个念头是直接在java中采用定时再调用定时,不过在网上查了多次后决定用mysql自带的定时器,比较数据库处理比代码处理更快。以下是自己在网上参考整理出来的定时器内容。
MySQL5.1.6起增加了事件调度器(Event Scheduler),可用来做定时执行某些特定任务,用于取代原先只能由操作系统的计 划任务来执行的工作。MySQL的事件调度器可以精确到每秒执行一个任务,而操作系统的计划任务只能精确到分钟级别。对于对数据实时性要求比较高的应用非常合适。
事件调度器也称为临时触发器(Temporal Triggers),因为事件调度器是基于特定时间周期触发来执行某些任务,而触发器(Triggers)是基于某个表所产生的事件触发的。

MySQL定时任务的实现方式有两种:

1、常规使用MySQL的event定时任务
2、使用Linux的定时任务crontab

保证事件调度器的状态是开启的

要保证能够执行事件,就必须保证事件计划是开启状态,事件计划默认为关闭状态。

# 查看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的配置。

事件任务

# 查看事件任务
$ 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

设置定时任务调用存储过程

# 若计划任务存在则删除
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

参数说明

1、ON SCHDULE schduler 定义执行的时间和时间间隔

2、ON COMPLETION [NOT] PRESERVE 定义事件是一次性执行还是永久执行,默认为一次性执行,即NOT PRESERVE。

在事件中ON SCHEDULE计划任务中有2种设定的方式

用来完成单次计划任务。

AT 时间戳

eg:5天后
AT CURRENT_TIMESTAMP + INTERVAL 5 DAY

eg:某时间点
AT TIMESTAMP '2018-07-12 12:00:00'

用来完成重复的计划任务

EVERY 时间(单位)的数量 时间单位 [STARTS 时间戳] [ENDS时间戳]

eg:每隔1EVERY 1 SECOND

eg:每隔10分钟。
EVERY 10 MINUTE

eg:从2018-08-01 12:00:00开始每隔1EVERY 1 DAY STARTS '2018-08-01 12:00:00'
EVERY 10 second STARTS TIMESTAMP '2018-08-01 12:00:00'

eg:5天后开启每天定时处理
EVERY 1 DAY START CURRENT_TIMESTAMP + INTERVAL 5 DAY

eg:每天定时处理5天后停止
EVERY 1 DAY ENDS CURRENT_TIMESTAMP + INTERVAL 5 DAY

在两种计划任务中,时间戳可以是任意的TIMESTAMPDATETIME数据类型,时间戳需要大于当前时间。

在重复的计划任务中,时间(单位)的数量可以是任意非空(NOT NULL)的整数形式,时间单位是关键词:YEARMONTHDAYHOURMINUTESECOND

到这里一个简单的定时任务大致就能做完。

本博客是自己第一次整理,几乎是从别人的博客搬过来的,但是从小白的角度来说,能做一个简单的定时器就是一个开始
博客转载地址:MySQL定时任务

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值