MySQL数据库定时任务——事件

一、简介

自mysql5.1.6起,增加了一个非常有特色的功能 - 事件调度器(event scheduler),可以用做定时执行某些特定任务(例如:删除记录、数据统计报告、数据备份等等),来取代原先只能由操作系统的计划任务来执行的工作。

值得一提的是mysql的事件调度器可以精确到每秒钟执行一个任务,而操作系统的计划任务(如:linux的cron)只能精确到每分钟执行一次。对于一些对数据实时性要求比较高的应用(例如:股票、赔率、比分等)就非常适合。

事件有时也可以称为临时触发器(temporal triggers),因为事件调度器是基于特定时间周期触发来执行某些任务,而触发器(triggers)是基于某个表所产生的事件触发的,区别也就在这里。

二、开启事件功能

检查是否开启事件功能:

show variables like 'event_scheduler';

如果’event_scheduler’的值为 'ON’表示调度器已开启,'OFF’为调度器未开启

开启事件:

set global event_scheduler = on;

关闭事件:

set global event_scheduler = off;

三、创建事件

语法:

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; 

参数定义

sql语法 说明
definer 可选项,给指定用户使用权限
if not exists 可选项,用于判断要创建的事件是否存在
event event_name 必选项,指定事件名称,event_name的最大长度为64个字符,如果为指定event_name,则默认为当前的mysql用户名(不区分大小写)
on schedule schedule 必选项,这里的schedule用于定义执行的时间和时间间隔,在下面我们详细讲解
on completion [not] preserve 可选项,配置事件执行完一次后的处理方式;当为on completion preserve 的时候,当event到期了,event会被disable,但是该event还是会存在当为on completion not preserve的时候,当event到期的时候,该event会被自动删除掉.
enable、disable、disable on slave 可选项,用于指定事件的一种属性。enable表示该事件是开启的,也就是调度器检查事件是否必选调用;disable表示该事件是关闭的,也就是事件的声明存储到目录中,但是调度器不会检查它是否应该调用;disable on slave表示事件在从机中是关闭的。如果不指定这三个选择中的任意一个,则在一个事件创建之后,它立即变为活动的。
comment ‘comment’ 可选项,用于定义事件的注释
do event_body 必选项,用于指定事件启动时所要执行的代码。可以是任何有效的sql语句、存储过程或者一个计划执行的事件。如果包含多条语句,可以使用begin…end复合结构

参数取值

schedule参数可取的值

schedule 调度时间配置语法:调度时间配置包括at 和 every两种

-- schedule参数可取的值:
at timestamp [+ interval interval] ...
 | every interval
 [starts timestamp [+ interval interval] ...]
 [ends timestamp [+ interval interval] ...]

interval参数可取的值

-- interval中包含的时间单位如下:
{
   
   year | quarter | month | day | hour | minute |
 week | second | year_month | day_hour | day_minute |
 day_second | hour_minute | hour_second | minute_second}

执行时间相关的例子

on schedule every 1 second         -- 每秒执行1次
on schedule every 2 minute         -- 每两分钟执行1次
on schedule every 3 day            -- 每3天执行1次
ON schedule every 1 day starts date_add(date_add_curdate(), interval 1 day), interval 1 hour)  -- 每天凌晨1点执行
ON schedule every 1 month starts date_add(date_add(date_sub(curdatte(),interval day(curdate())-1 day),interval 1 month),interval 1 hour) -- 每个月的第一天凌晨1点执行

on schedule at current_timestamp()+interval 5 day     -- 5天后执行
on schedule at current_timestamp()+interval 10 minute -- 10分钟后执行
on schedule at '2016-10-01 21:50:00'                  -- 在2016年10月1日,晚上9点50执行
ON schedule EVERY 3 MONTH STARTS CURRENT_TIMESTAMP + 1 WEEK -- 每 3 个月,从现在起一周后开始
ON schedule  EVERY 12 HOUR STARTS CURRENT_TIMESTAMP + INTERVAL 30 MINUTE ENDS CURRENT_TIMESTAMP + INTERVAL 4 WEEK -- 每十二个小时,从现在起三十分钟后开始,并于现在起四个星期后结束

on schedule every 1 day starts current_timestamp()+interval 5 day ends current_timestamp()+interval 1 month -- 5天后开始每天都执行执行到下个月底
on schedule every 1 day ends current_timestamp()+interval 5 day -- 从现在起每天执行,执行5天

示例:

示例1:创建一个每天凌晨1点执行的任务

CREATE EVENT my_event
ON SCHEDULE
EVERY 1 DAY
STARTS CURRENT_TIMESTAMP + INTERVAL 1 DAY
ON COMPLETION PRESERVE
DO
-- 这里是任务的具体操作,可以是SQL语句或存储过程
INSERT INTO my_table (column1, column2) VALUES ('value1', 'value2');

上述示例将在每天凌晨1点执行一次任务,向my_table表中插入一条记录。

示例2:每隔三秒钟插入一条数据

-- 创建一个每隔3秒往test表中插入一条数据的事件 
CREATE EVENT IF NOT EXISTS e_test_1 
ON SCHEDULE 
EVERY 3 SECOND
ON COMPLETION PRESERVE
DO 
INSERT INTO test(id,t1) VALUES(NULL,NOW());

示例3:定时清空test表数据

-- 创建一个10分钟后清空test表数据的事件 
CREATE EVENT IF NOT EXISTS e_test_2
ON SCHEDULE
AT CURRENT_TIMESTAMP + INTERVAL 1 MINUTE
DO 
TRUNCATE TABLE test;

示例4:call调用存储过程

-- 调用存储过程 
-- 创建过程
CREATE PROCEDURE pro_test()
    BEGIN
        INSERT INTO test(id,t1,id2) VALUES(NULL,NOW(),'1000000');
    END
-- 调用过程
CREATE EVENT IF NOT EXISTS e_test_3 
ON SCHEDULE 
EVERY 3 SECOND
ON COMPLETION PRESERVE
DO 
CALL pro_test();

四、查看事件

查看全部事件

SHOW EVENTS;

此命令将列出 MySQL 数据库中所有的事件,它将返回事件的名称、表的名称、执行间隔、启动时间和语句等相关信息。

查看详细信息

SELECT * FROM INFORMATION_SCHEMA.EVENTS;

这是一种更为详细的查看事件的方法。它可以显示MySQL服务器中所有的事件,并且可以查看到事件的详细信息。包括事件的名称、状态、启动时间、结束时间、执行周期、语句等等。其中的“LAST_EXECUTED”列就是事件上次执行的时间,如果该列的值为NULL则表示事件还没有执行过。
但是,需要注意的是,只有拥有“SELECT”权限的用户才能执行这个语句。

查看所有开启的事件

select * from information_schema.events where status = 'enabled'; 

上述语句返回的结果列表中包含MySQL中正在活动的所有事件信息,这些信息包括:事件名称、创建者、ID、定义事件的SQL语句、事件运行周期、事件的执行时间等。

使用mysql.event表查看

SELECT * FROM mysql.event;

这是使用mysql.event表来查看事件的方法。mysql.event表是MySQL存储事件信息的表,其中包含了事件的详细信息。可以通过查看mysql.event表来了解所有的事件。

如果你需要查看某个具体事件的详细信息,可以使用以下命令:

查看特定事件

SHOW EVENTS LIKE 'event_name';

在这个命令中,将“event_name”替换为你要查看的事件的名称,然后 MySQL 将返回该事件的详细信息和语句。

查看事件定义

SHOW CREATE EVENT event_name;

这是一种查看事件的创建语句的方法。通过这个语句可以查看到事件的名称、执行时间、执行周期、事件的语句等等。

五、删除事件

删除事件

DROP EVENT [IF EXISTS] event_name(事件名称);

例如:

DROP EVENT event_name;

六、修改事件

语法

ALTER
    [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;

开启事件

alter event event_name(事件名称)  ENABLE; 

关闭事件

alter event event_name(事件名称)  DISABLE; 

修改事件信息

alter event test.event_minute  
on schedule   
every  30 second    
do 
insert into events_list values('event_now', now());  

七、总结

使用 MySQL 事件可以轻松地执行周期性的任务,从而提高数据库效率和性能。掌握如何使用事件是管理和优化 MySQL 数据库的重要知识点,可以更好地理解MySQL事件的特点和使用方式,从而更好地使用MySQL。希望本文对你有所帮助。

猜你喜欢

转载自blog.csdn.net/weixin_44816664/article/details/134206285
今日推荐