事件(event)是MySQL在相应的时刻调用的过程式数据库对象。一个事件可调用一次,也可周期性的启动,它由一个特定的线程来管理的,也就是所谓的“事件调度器”。
优点:一些对数据定时性操作不再依赖外部程序,而直接使用数据库本身提供的功能。
可以实现每秒钟执行一个任务,这在一些对实时性要求较高的环境下就非常实用了。
缺点:定时触发,不可以调用。
1)向导创建
选择对应数据库下事件->右键新建事件>填写事件信息->保存->填写事件名
语法:
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}
名词解释:
子句 | 说明 |
---|---|
DEFINER | 可选,用于定义事件执行时检查权限的用户 |
IF NOT EXISTS | 可选项,用于判断要创建的事件是否存在 |
EVENT event_name | 必选,用于指定事件名,event_name的最大长度为64个字符,如果为指定event_name,则默认为当前的MySQL用户名(不区分大小写) |
ON SCHEDULE schedule | 必选,用于定义执行的时间和时间间隔 |
ON COMPLETION [NOT] PRESERVE | 可选,用于定义事件是否循环执行,即是一次执行还是永久执行,默认为一次执行,即 NOT PRESERVE |
ENABLE | DISABLE | DISABLE ON SLAVE | 可选项,用于指定事件的一种属性。其中,关键字ENABLE表示该事件是活动的,也就是调度器检查事件是否必选调用;关键字DISABLE表示该事件是关闭的,也就是事件的声明存储到目录中,但是调度器不会检查它是否应该调用;关键字DISABLE ON SLAVE表示事件在从机中是关闭的。如果不指定这三个选择中的任意一个,则在一个事件创建之后,它立即变为活动的。 |
COMMENT ‘comment’ | 可选,用于定义事件的注释 |
DO event_body | 必选,用于指定事件启动时所要执行的代码。可以是任何有效的SQL语句、存储过程或者一个计划执行的事件。如果包含多条语句,可以使用BEGIN…END复合结构 |
实例:
drop table if exists events_list;
create table events_list(event_name varchar(20) not null, event_started timestamp not null);
create event event_now
on schedule
at now()
do insert into events_list values('event_now', now());
看插入表的数据是没有的,就需要查看调度器是否启动,
MySQL事件调度器event_scheduler负责调用事件,它默认是关闭的。这个调度器不断地监视一个事件是否要调用, 要创建事件,必须打开调度器.
//查看状态
show variables like '%event_scheduler%'
结果:
event_scheduler OFF
//开启调度器 (其中一个语句即可)
SET GLOBAL event_scheduler = ON;
SET @@global.event_scheduler = ON;
SET GLOBAL event_scheduler = 1;
SET @@global.event_scheduler = 1;
//查看调度线程
show processlist
//关闭调度器(其中一个语句即可)
SET GLOBAL event_scheduler = OFF;
SET @@global.event_scheduler = OFF;
SET GLOBAL event_scheduler = 0;
SET @@global.event_scheduler = 0;
//在创建一个
create event test.event_hour
on schedule
every 1 hour
do insert into events_list values('event_now', now());
1)选中想要查看的事件->设计事件
2) sql 查看
//查看当前库事件
show events;
// 查看所有事件
SELECT * FROM INFORMATION_SCHEMA.EVENTS
select * from mysql.event
// 可以根据名称查看所有自定义的存储,支持模糊查询
SHOW events where Db ="py_etl"
show events where name like 'test_event_hour';
select * from mysql.event where name like 'test_event_hour';
SELECT * FROM INFORMATION_SCHEMA.EVENTS where EVENT_NAME like 'test_event_hour'
以上参数说明如下表所示:
参数名 | 说明 |
---|---|
EVENT_CATALOG | 事件存放目录,一般情况下,值为 def,不建议修改 |
EVENT_SCHEMA | 事件所在的数据库 |
EVENT_NAME | 事件名称 |
DEFINER | 事件的定义者 |
TIME_ZONE | 事件使用的时区,默认是 SYSTEM,不建议修改 |
EVENT_BODY | 一般情况下,值为 SQL,不建议修改 |
EVENT_DEFINITION | 该事件的内容,可以是具体的 INSERT 等 SQL,也可以是一个调用的存储过程 |
EVENT_TYPE | 事件类型,这个参数比较重要,在定义时指定 有两个值:RECURRING 和 ONE TIME RECURRING 表示只要符合条件就会重复执行,RECURRING 类型的事件一般为 NULL,表示该事件的预计执行时间 ONE TIME 只会调用 EXECUTE_AT,针对 one-time 类型的事件有效 |
INTERVAL_VALUE | 针对 RECURRING 类型的事件有效,表示执行间隔长度 |
INTERVAL_FIELD | 针对 RECURRING 类型的事件有效,表示执行间隔的单位,一般是 SECOND,DAY 等值,可参考创建语法 |
SQL_MODE | 当前事件采用的 SQL_MODE |
STARTS | 针对 RECURRING 类型的事件有效,表示一个事件从哪个时间点开始执行,和 one-time 的 EXECUTE_AT 功能类似。 为 NULL 时表示一符合条件就开始执行 |
ENDS | 针对 RECURRING 类型的事件有效,表示一个事件到了哪个时间点后不再执行,如果为 NULL 就是永不停止 |
STATUS | 一般有三个值,ENABLED、DISABLED 和 SLAVESIDE_DISABLED |
ON_COMPLETION | 只有两个值,PRESERVE 和 NOT PRESERVE |
CREATED | 事件的创建时间 |
LAST_ALTERED | 事件最近一次被修改的时间 |
LAST_EXECUTED | 事件最近一次执行的时间,如果为 NULL 表示从未执行过 |
EVENT_COMMENT | 事件的注释信息 |
ORIGINATOR | 当前事件创建时的 server-id,用于主从上的处理,比如 SLAVESIDE_DISABLED |
CHARACTER_SET_CLIENT | 事件创建时的客户端字符集 |
COLLATION_CONNECTION | 事件创建时的连接字符校验规则 |
DATABASE_COLLATION | 事件创建时的数据库字符集校验规则 |
1)选中想要查看的事件->设计事件->填写事件信息->保存
2) sql 查看
//更改计划,要使事件每2分钟运行一次,请使用以下语句:
ALTER EVENT test_event_hour ON SCHEDULE EVERY 2 MINUTE;
//更改事件主体
ALTER EVENT `test_event_hour`
DO insert into events_list values('event', now());
//禁用事件
ALTER EVENT `test_event_hour` DISABLE;
//启用事件
ALTER EVENT `test_event_hour` ENABLE;
//重命名事件,MySQL中不为提供RENAME EVENT语句。不过可以使用ALTER EVENT来重命名现有事件,如下所示:
ALTER EVENT `test_event_hour` RENAME TO test_event;
// 请注意,ALTER EVENT语句仅应用于现有事件。如果尝试修改不存在的事件,MySQL将发出一个错误消息,因此,应该先使用SHOW EVENTS语句来检查事件是否存在,然后再更改它。
1)选中想要查看的事件->删除事件
2) sql 删除
DROP EVENT [IF EXISTS] event_name;