mysql的event定时任务

简介: mysql的event定时任务

导语:

最近用到了mysql的event,就学习了一波,记录一下。
mysql从5.7之后就增加了event的功能,类似于linux的crontab,就是定时任务,用来一次性或者周期性执行某些任务。

event的主要特征和属性:

1.在mysql中event的是根据它的名称和schema来唯一标识一个事件的。

2.event中可以是由一句sql语句组成,也可以是由BEGIN-END的代码块组成。event可以执行一次或周期性执行,周期性执行可以设置有规律的开始时间和结束时间,也可以分别单独设置开始时间,结束时间,或者都不设置也可以。
默认情况下,只要定时任务设置成功,它就会一直执行下去,直到event是不可用的或者被删除掉。
这里要注意的点:如果在一个周期内event没有执行完毕,另一个event的实例也会开始执行。例如A事件设置的一分钟执行一次,还没有执行完已经到第二分钟,此时会有另外一个新的event实例也开始执行。如果这些实例之间有竞争资源的关系,可能会导致mysql服务变得很慢。

3.用户可以创建,修改,删除事件。语法上有错误的创建或者修改语句会直接抛出错误信息。用户可以在事件的动作里面写入用户本身没有权限的操作语句,
创建和修改可以成功,但是执行的时候回抛出异常。例如用户对A表只有select的权限,他在event中对A表进行了update,事件可以创建或者修改成功,但是执行的时候是会报错的(这个略坑,本来写完觉得没问题,结果是只有在
执行的时候在才只知道有没有问题)。

4.sql语句可以修改事件的名称,时间,执行周期,状态(启用还是禁用)和schema等等。

5.事件的创建者默认是创造这个事件的用户,但是如果有其他用户也对这个事件进行了修改,那么事件的创建者就会变更为最后一个对这个事件进行修改的用户。只要有改数据库的event权限的用户,都可以修改event的内容。

event的设置:

event的参数值叫event_scheduler,它有三个值:NO,OFF,DISABLED。对应的语义是开启,关闭和不可用。
注意:在命令行设置的参数值,在mysql重启后都会失效,只有在配置文件中修改的值,在重启后不会失效。

开启event:
在mysql的命令行中输入:

SET GLOBAL event_scheduler = ON;
SET @@GLOBAL.event_scheduler = ON;
SET GLOBAL event_scheduler = 1;
SET @@GLOBAL.event_scheduler = 1;

关闭event

SET GLOBAL event_scheduler = OFF;
SET @@GLOBAL.event_scheduler = OFF;
SET GLOBAL event_scheduler = 0;
SET @@GLOBAL.event_scheduler = 0;

尽管ON和1,OFF和0是等价的,但是尽量使用ON和oFF,因为还有一个值DISABLED是没有数字的值来对应的,所以尽量用英文。
注意:
只有在服务器启动时才可以将事件调度程序设置为DISABLED。
如果event_scheduler为ON或OFF,则无法在运行时将其设置为DISABLED。
而且如果在启动时将事件计划程序设置为DISABLED,也无法在运行时更改event_scheduler的值。

将event设置为不可用的方式有两种
命令行:

--event-scheduler=DISABLED

配置文件

event_scheduler=DISABLED

event的语法:

1.event的创建:

CREATE
    [DEFINER = user]
    EVENT
    [IF NOT EXISTS]
    event_name
    ON SCHEDULE schedule
    [ON COMPLETION [NOT] PRESERVE]
    [ENABLE | DISABLE | DISABLE ON SLAVE]
    [COMMENT 'string']
    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}

这个是官方的创建规范,看上去有点让人头大,我们举个例子来看下帮助理解下。
我们来创建一个每分钟执行某一个select语句(其实查询没啥意义,仅仅作为演示)

CREATE EVENT test_insert   (创建名为test_insert的event)
  ON SCHEDULE EVERY 1 MINUTE   (每一分钟跑一次)
  DO                            (执行查询语句)
    SELECT NOW();

上面这个是单个语句的event,我们在看下如果是复合的语句,使用BEGIN-END来完成。

delimiter //

CREATE EVENT test_insert
    ON SCHEDULE
      EVERY 1 MINUTE
    COMMENT '事件添加的注释'
    DO
      BEGIN
        INSERT INTO XXX;
        UPDATE XXX;
      END //

delimiter ;

如果读者写过存储过程的话,会容易理解这个多行的语句,和写储存过程的语法差的不多,只是外面加了创建event的过程。
event也可以周期性的去调用存储过程,将要执行的内容放到储存过程里面,然后用event去调用会比直接将所有逻辑全部写入到event里面要好。
因为event执行不会有报错信息,也不会有报错的日志,很难去调试。如果是放到储存过程中,可以用手动调用一下储存过程,如果有问题可以直接根据报错信息来排查语句中存在的问题。

2.修改event:

基本上和创建是一样的,直接贴上官方的规范写法。

ALTER
    [DEFINER = user]
    EVENT event_name
    [ON SCHEDULE schedule]
    [ON COMPLETION [NOT] PRESERVE]
    [RENAME TO new_event_name]
    [ENABLE | DISABLE | DISABLE ON SLAVE]
    [COMMENT 'string']
    [DO event_body]

3.删除event:

删除event是根据event的名称来删除的。

DROP EVENT [IF EXISTS] event_name

4.查看event的元数据:

查看事件的三种方式:
SELECT * FROM INFORMATION_SCHEMA.EVENTS;
SHOW EVENTS;
SELECT * FROM mysql.event;


查看创建event的创建语句:
SHOW CREATE EVENT

5.赋予event权限

event的权限就叫EVENT,下面是通用的赋权语句,将用户user在host上赋予database的table表event的权限。

GRANT EVENT ON database.table TO user@host;

总结:

1.event相当于是mysql自带的定时任务,可以用来处理一些周期性的工作,比如每个月定时计算某些表的统计数据。比较方便。
2.event的功能还不够强大,debug其实比较麻烦,也不打印报错信息,建议在event中去调用储存过程,这样可以直接CALL来调用event中要执行的储存过程,来判断语句中有没有问题。另外一种方式就值执行event的时候往一张日志表去写入执行event的数据信息,这样event有没有执行,是否报错都一目了然。
3.event的间隔要设置合理,因为event是可以并发执行的,如果第一个event没有执行完,还拿着行锁或者表锁,第二个event在来执行就会阻塞,还没执行完,后面的event又来了。这样就可能会把数据库的性能降得很低。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
存储 关系型数据库 MySQL
MySQL创建定时任务
MySQL创建定时任务
274 0
|
SQL 关系型数据库 MySQL
OceanBase数据库社区版的MySQL模式支持定时任务
OceanBase数据库社区版的MySQL模式支持定时任务
1315 1
|
人工智能 运维 Java
SpringBoot+MySQL实现动态定时任务
这是一个基于Spring Boot的动态定时任务Demo,利用spring-context模块实现任务调度功能。服务启动时会扫描数据库中的任务表,将任务添加到调度器中,并通过固定频率运行的ScheduleUpdater任务动态更新任务状态和Cron表达式。核心功能包括任务的新增、删除与Cron调整,支持通过ScheduledFuture对象控制任务执行。项目依赖Spring Boot 2.2.10.RELEASE,使用MySQL存储任务信息,包含任务基类ITask及具体实现(如FooTask),便于用户扩展运维界面以增强灵活性。
522 10
|
SQL 关系型数据库 MySQL
如何创建RDS MySQL定时任务?
RDS MySQL支持通过事件调度器(Event Scheduler)实现定时任务,如数据清理、统计报告等。需先开启Event Scheduler,再通过DMS或SQL创建、查看、删除事件,自动化执行数据库操作,提升运维效率。
|
关系型数据库 MySQL 调度
如何在MySQL中创建定时任务?
MySQL 事件调度器(Event Scheduler)可实现定时任务自动化。例如,每天凌晨清空 `test` 表,并在一个月后自动停止任务。需先启用调度器(`SET GLOBAL event_scheduler = ON`),再创建事件(使用 `CREATE EVENT` 定义执行频率和操作)。推荐用 `TRUNCATE` 提高效率,注意权限与时区设置。为防数据丢失,可结合备份机制。到期后事件自动禁用,建议定期清理。
785 4
|
SQL 监控 关系型数据库
Mysql主从同步报错解决:Error executing row event: Table zabbix.history-..
Mysql主从同步报错解决:Error executing row event: Table zabbix.history-..
692 0
|
SQL 关系型数据库 MySQL
定时任务频繁插入数据导致锁表问题 -> 查询mysql进程
定时任务频繁插入数据导致锁表问题 -> 查询mysql进程
346 1
|
存储 关系型数据库 MySQL
21. Mysql 事件或定时任务,解放双手,轻松实现自动化
21. Mysql 事件或定时任务,解放双手,轻松实现自动化
687 1
|
存储 SQL 关系型数据库
MySQL job 定时任务
MySQL job 定时任务
|
存储 Java 关系型数据库
分布式定时任务框架Quartz总结和实践(2)—持久化到Mysql数据库
本文主要介绍分布式定时任务框架Quartz集成SpringBoot持久化数据到Mysql数据库的操作,上一篇文章使用Quartz创建定时任务都是保存在内存中,如果服务重启定时任务就会失效,所以Quartz官方也提供将定时任务等信息持久化到Mysql数据库的功能,本文主要实现这种Quartz的这种使用方式。
2586 0
分布式定时任务框架Quartz总结和实践(2)—持久化到Mysql数据库

推荐镜像

更多