MySQL中的event(JOB、定时任务)

0    72    1

👉 本文共约3142个字,系统预计阅读时间或需12分钟。

MySQL5.1.6起增加了事件调度器(Event Scheduler),可用来做定时执行某些特定任务,用于取代原先只能由操作系统的计划任务来执行的工作。MySQL的事件调度器可以精确到每秒执行一个任务,而操作系统的计划任务只能精确到分钟级别。对于对数据实时性要求比较高的应用非常合适。

事件调度器也称为临时触发器(Temporal Triggers),因为事件调度器是基于特定时间周期触发来执行某些任务,而触发器(Triggers)是基于某个表所产生的事件触发的。

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

  • 使用MySQL的event定时任务
    使用MySQL的事件计划,首先需要在服务器开启event_scheduler后才能处理。
  • 使用Linux的定时任务crontab

如何开启事件计划呢?

如果执行命令后返回值为OFF则表示目前事件计划是处于关闭的状态。

开启的方式也分为两种,临时方式使用命令行或脚本操作,永久修改则需要修改MySQL主配置文件my.ini在其中添加event_schduler=1的配置后重启MySQL。

临时性修改只要不重启MySQL在当前运行状态下会直接生效,一旦重启后则失效。

事件调度器

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

在真实开发环境中会遇到MySQL服务重启或断电的情况,此时会出现事件调度器被关闭的情况。所有事件都不再起作用,解决的方式需要在MySQL的配置文件mysql.ini中加入event_scheduler=ON的配置。

事件任务

事件任务

设置定时任务执行SQL语句

例如:从当日开始每天凌晨4点删除fight表超过一个月的数据

计划任务

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

参数说明

  • ON SCHDULE schduler 定义执行的时间和时间间隔
  • ON COMPLETION [NOT] PRESERVE 定义事件是一次性执行还是永久执行,默认为一次性执行,即NOT PRESERVE

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

  • 用来完成单次计划任务。

  • 用来完成重复的计划任务

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

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

ON COMPLETION参数表示“当这个事件不会再发生的时候”,即当单次计划任务执行完毕后或当重复性的计划任务执行到了ENDS阶段。而PRESERVE的作用是使事件在执行完毕后不会被DROP掉,建议使用该参数,以便于查看EVENT具体信息。

存储过程

错误处理

出现错误

解决方案

出现提示

image-20220624085545765

ERROR

创建事件示例

先来看一下他的语法:

  

  1) 首先来看一个简单的例子来演示每秒插入一条记录到数据表 

  等待3秒之后,再执行查询看看

  img

  2) 5天后清空test表:

  3) 2007年7月20日12点整清空test表:

  4) 每天定时清空test表:

  5) 5天后开启每天定时清空test表:

  6) 每天定时清空test表,5天后停止执行:

  7) 5天后开启每天定时清空test表,一个月后停止执行:

  [ON COMPLETION [NOT] PRESERVE]可以设置这个事件是执行一次还是持久执行,默认为NOT PRESERVE。

 8) 每天定时清空test表(只执行一次,任务完成后就终止该事件):

  [ENABLE | DISABLE]可以设置该事件创建后状态是否开启或关闭,默认为ENABLE。
  [COMMENT ‘comment’]可以给该事件加上注释。

修改事件

先来看一下他的语法:

  1) 临时关闭事件

  2) 开启事件

  3) 将每天清空test表改为5天清空一次:

本人提供Oracle、MySQL、PG等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!

  

删除事件

先来看一下他的语法:

  例如删除前面创建的e_test事件

  当然前提是这个事件存在,否则会产生ERROR 1513 (HY000): Unknown event错误,因此最好加上IF EXISTS

  注意:如果你将event执行了Alter event event_name disable.那么当你重新启动mysql服务
器后,该event将被删除(测试版本:5.1.30)

  备注:在event事件中:ON SCHEDULE 计划任务,有两种设定计划任务的方式:

  (1)AT 时间戳,用来完成单次的计划任务

  (2)EVERY 时间(单位)的数量实践单位[STARTS 时间戳] [ENDS时间戳],用来完成重复的计划任务。

 在两种计划任务中,时间戳可以是任意的TIMESTAMP 和DATETIME 数据类型,时间戳需要大于当前时间。
  在重复的计划任务中,时间(单位)的数量可以是任意非空(Not Null)的整数式,时间单位是关键词:YEAR,MONTH,DAY,HOUR,MINUTE 或者SECOND。

  提示: 其他的时间单位也是合法的如:QUARTER, WEEK, YEAR_MONTH,DAY_HOUR,DAY_MINUTE,DAY_SECOND,HOUR_MINUTE,HOUR_SECOND, MINUTE_SECOND,不建议使用这些不标准的时间单位。

   [ON COMPLETION [NOT] PRESERVE]:ON COMPLETION参数表示"当这个事件不会再发生的时候",即当单次计划任务执行完毕后或当重复性的计划任务执行到了ENDS阶段。而PRESERVE的作用是使事件在执行完毕后不会被Drop掉,建议使用该参数,以便于查看EVENT具体信息。

应用案例

  本案例是利用 event scheduler 的特性,每秒钟调用一次存储过程,用于判断 SLAVE 是否正常运行,如果发现 SLAVE 关闭了,忽略 0 次错误,然后重新启动 SLAVE。

  1)首先创建存储过程

  由于存储过程中无法调用类似 SHOW SLAVE STATUS 这样的语句,因此无法得到确切的复制错误信息和错误代码,不能进一步的处理 SLAVE 停止的各种情况。

  2)接着,创建任务

   创建了一个任务,每 5秒钟执行一次,任务结束后依旧保留该任务,而不是删除。当然了,在本例中的任务不会结束,除非将它手动禁止了。

  如果在运行中想要临时关闭一下某个任务,执行 ALTER EVENT 语句即可:

    头像

    小麦苗

    学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

    您可能还喜欢...

    发表评论

    您的电子邮箱地址不会被公开。

    5 + 17 =

     

    嘿,我是小麦,需要帮助随时找我哦
    • 18509239930
    • 个人微信

    • 麦老师QQ聊天
    • 个人邮箱
    • 点击加入QQ群
    • 个人微店

    • 回到顶部
    返回顶部