mysql事件
事件是什么
MySQL5.1版本开始引进event概念,MySQL
中的事件(event:时间触发器)是用于执行定时或周期性的任务,类似Linux中的crontab,但是后者只能精确到分钟,事件可以精确到秒。通过单独或调用存储过程使用,在某一特定的时间点,触发相关的SQL语句或存储过程。事件由一个特定的线程来管理的,也就是所谓的事件调度器,但是事件不能直接调用。
事件的优缺点
优点
一些对数据定时性操作不再依赖外部程序,而直接使用数据库本身提供的功能。
可以实现每秒钟执行一个任务,这在一些对实时性要求较高的环境下就非常实用了。
缺点
定时触发,不可以调用。
创建事件
一条create event语句创建一个事件。每个事件由两个主要部分组成,第一部分是事件调度(event
schedule),表示事件何时启动以及按什么频率启动,第二部分是事件动作(event action
),这是事件启动时执行的代码,事件的动作包含一条SQL语句,它可能是一个简单地insert或者update语句,也可以使一个存储过程或者benin…end语句块,这两种情况允许我们执行多条SQL。一个事件可以是活动(打开)的或停止(关闭)的,活动意味着事件调度器检查事件动作是否必须调用,停止意味着事件的声明存储在目录中,但调度器不会检查它是否应该调用。在一个事件创建之后,它立即变为活动的,一个活动的事件可以执行一次或者多次。
创建事件的语法
CREATE
[DEFINER = { user | CURRENT_USER }] //定义事件执行的时候检查权限的用户
EVENT
[IF NOT EXISTS]
event_name
ON SCHEDULE schedule //定义执行的时间和时间间隔。
[ON COMPLETION [NOT] PRESERVE] //定义事件是一次执行还是永久执行,默认为一次执行,即NOT PRESERVE。
[ENABLE | DISABLE | DISABLE ON SLAVE] // 定义事件创建以后是开启还是关闭,以及在从上关闭。如果是从服务器自动同步主上的创建事件的语句的话,会自动加上DISABLE ON SLAVE。
[COMMENT 'comment'] //定义事件的注释。
DO sql_statement; //事件的主题,执行语句
事件语法的相关解释:
- event_name:事件是模式对象,与表、存储过程和触发器一样。 event_name 必须是有效的标识符,且可以按正常方式通过模式名称进行引用和 / 或限定。事件名称在模式中必须是唯一的。
- schedule :调度表是一种规则,用于指定 MySQL 执行与事件相关联的操作的时间
- sql_statement :您必须包含按调度表执行的有效 SQL 语句或存储过程语句。此语句受到的限制与适用于存储函数和动态 SQL 的限制相同。例如,该语句无法返回结果集(如 SELECT 或 SHOW 所生成的结果集)。通常会使用 CALL 语句调用过程来执行实际操作。
schedule
调度表是指定应在何时执行操作的规则。可以在 CREATE EVENT 和 ALTER EVENT 语句的 SCHEDULE 子句中指定调度表。
有两种类型的调度表:执行一次的调度表(使用 AT 关键字)和可重复执行的调度表(使用 EVERY 关键字)。对于后者,必须定义事件的重复频率。还可以定义一个时间段,以确定应重复执行事件的期限。
SCHEDULE 子句的语法如下所示:
AT timestamp [+ INTERVAL interval]| EVERY interval [STARTS timestamp [+ INTERVAL interval]] [ENDS timestamp [+ INTERVAL interval]]
SCHEDULE 子句可包含以下变量元素:
timestamp : DATETIME 或 TIMESTAMP 类型的表达式;
interval :用于指定持续时间。持续时间的表示方法为,指定一个整数数量,后跟用于定义特定种类持续时间的关键字。有效的关键字包括:
- YEAR,QUARTER, MONTH, DAY, HOUR, MINUTE, WEEK, SECOND, YEAR_MONTH, DAY_HOUR, DAY_MINUTE, DAY_SECOND, HOUR_MINUTE, HOUR_SECOND, MINUTE_SECOND
事件调度程序是 mysqld 进程中的一个单独线程,负责执行调度事件。调度程序会检查是否应执行事件;如果应执行事件,则会创建新的连接来执行操作。
使用事件来自动地定期执行(维护)任务,如更新汇总表或刷新查询中的表(物化视图 仿真),或者执行夜间作业。例如,处理白天的工作、加载数据仓库或者将数据导出到 文件中。
启用事件调度程序
创建事件后,该事件将存储在数据库中,以便按调度表执行。 event_scheduler线程会监控所有事件的调度表,在到达调度表中的时间时,该线程会启动一个新的线程来执行每个事件。
默认情况下, event_scheduler 线程设置为 OFF 。您必须显式启用该线程,方法为修改全局 event_scheduler服务器变量的值,将其设置为 ON。
查看event功能是否开启 |
创建事件的例子
delimiter && |
查看事件
查看当前所在库的事件:
show events; |
启用和禁用
alter event event_name disable; //event_name事件的名称 |
删除事件
drop event [if exists] event_name |
又一个例子
delimiter $$ |
写事件时建议模仿上面这个例子