自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 调度时间配置语法:调度时间配置包括at 和 every两种
-- schedule参数可取的值:
at timestamp [+ interval interval] ...
| every interval
[starts timestamp [+ interval interval] ...]
[ends timestamp [+ 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天
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表中插入一条记录。
-- 创建一个每隔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());
-- 创建一个10分钟后清空test表数据的事件
CREATE EVENT IF NOT EXISTS e_test_2
ON SCHEDULE
AT CURRENT_TIMESTAMP + INTERVAL 1 MINUTE
DO
TRUNCATE TABLE test;
-- 调用存储过程
-- 创建过程
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语句、事件运行周期、事件的执行时间等。
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。希望本文对你有所帮助。