时间调度器

回到首页☞

1、定位

了解

2、概述

定时任务几乎很多系统或者语言都有这个功能,也是常规功能,linux的 crontab,java quaze job,js 的定时器等等。
mysql也有自己的定时器event,目前实际项目没用过,因为我们往往习惯用放到mybatis实现,为了便于维护。

MySQL事件调度器(Event Scheduler),可以在某一个时间点执行一个SQL语句或一个语句块(BEGIN … END);或者每隔固定间隔重复执行。类似于Linux下的at、crontab或Windows下的Task Scheduler。

3、使用event

3.1、开启数据库的event执行调度

show variables like '%event_scheduler%';

本地没开,开启需要权限:

set global event_scheduler=1;

注意:

如果是设定事件计划为0 或OFF,即关闭事件计划进程的时候,不会有新的事件执行,但现有的正在运行的事件会执行到完毕。

对于线上环境来说,使用even时,注意在主库上开启定时器,从库上关闭定时器,event触发所有操作均会记录binlog进行主从同步,从库上开启定时器很可能造成卡库。切换主库后之后记得将新主库上的定时器打开。

3.2、CREATE EVENT创建

CREATE
  [DEFINER = { user | CURRENT_USER }]
EVENT
  [IF NOT EXISTS]
event_name
ON SCHEDULE schedule
  [ON COMPLETION [NOT] PRESERVE]
  [ENABLE | DISABLE | DISABLE ON SLAVE]
  [COMMENT 'comment']
DO event_body;

schedule:
  AT timestamp [+ INTERVAL interval] ...
  |EVERY interval
  [STARTS timestamp [+ INTERVAL interval] ...]
  [ENDS timestamp [+ INTERVAL interval] ...]
 

interval:
  quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
        WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
        DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}

3.2.1、详细解析:

  • definer:指明该event的用户,服务器在执行该事件时,使用该用户来检查权限。

默认用户为当前用户,即definer = current_user;

如果明确指明了definer,则必须遵循如下规则:

1.如果没有super权限,唯一允许的值就是自己当前用户,而不能设置为其他用户。

2.如果具有super权限,则可以指定任意存在的用户;如果指定的用户不存在,则事件在执行时会报错。

  • if not exists:如果事件已经存在,则不会创建,也不会报错。

  • on schedule子句:指定何时执行该事件,以及如何执行该事件

1)at timestamp用于创建单次执行的事件,timestamp执行事件执行的时间(如果指定的时间是过去的时间,则会产生一个warning),时间可以是具体的时间字符串或者是一个datetime类型的表达式(如current_timestamp):

如果要指定将来某个时间,直接使用at timestamp,例:at ‘2017-08-08 08:08:08’;

如果要指定将来某个时间间隔,可利用interval关键字(interval关键字可以进行组合,at timestamp + INTERVAL 2 HOUR、 + INTERVAL 30 MINUTE)

2)every子句用于创建重复执行的事件,如果每分钟执行一次,则可以:EVERY 1 MINUTE。

当然,every子句可以指定一个开始事件和结束时间,通过STARTS和ENDS关键字来表示,具体语法与前面类似

例如:EVERY 12 HOUR STARTS CURRENT_TIMESTAMP + INTERVAL 30 MINUTE ENDS CURRENT_TIMESTAMP + INTERVAL 4 WEEK。

  • 通常情况下,如果一个事件已过期,则会被立即删除。但是,create event定义中通过on completion preserve子句可以保留已过期的时间。

默认:ON COMPLETION NOT PRESERVE,也就是不保存

  • 默认情况下,enable on slave,事件一旦创建后就立即开始执行;可以通过disable关键字来禁用该事件。

  • comment子句用于给事件添加注释。

  • do子句用于指示事件需要执行的操作,可以是一条SQL语句,也可以是被begin…end包括的语句块,也可以在语句块中调用存储过程。

3.2.2、基本格式

    CREATE EVENT event_name

    ON SCHEDULE  <schedule>

    DO <event_body>;

3.2.3、示例定时插入一条记录

CREATE EVENT t_emp_event
ON SCHEDULE EVERY 10 MINUTE COMMENT '每10分钟插入一条数据到t_emp表' DO
BEGIN
		
		SET @deptNo = 2;
	
	SET @eName = substring( MD5( RAND( ) ), 1, 4 );
	
	SET @salary = round( ( RAND( ) * 10000 ) + 10000 );
	INSERT INTO t_emp ( dept_no, hire_date, ename, salary )
	VALUES
		( @deptNo, now( ), @eName, @salary );
	
	END

3.3 、删除或者停用

alter evnent t_emp_event disable;
drop evnent t_emp_event;

回到首页☞

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值