(转)mysql中event的用法详解

原创
小哥 2年前 (2023-05-24) 阅读数 36 #大杂烩

转自:http://www.cnblogs.com/langtianya/p/5445528.html

另外,还有一个非常好的文档已上传到资源下载 http://download.csdn.net/detail/shellching/9845945

一、基本概念
mysql5.1版本介绍开始event概念。event“时间触发器”和triggers事件的触发是不同的,event类似与linux crontab计划时间触发任务。通过单独使用存储过程或调用它们在特定时间点触发相关事件SQL语句或存储过程。

二、适用范围
对于定期有固定需求的操作,如创建表、删除数据等,可以使用event来处理。

例如:使用event在每月的1日凌晨1单击可自动创建下个月需要使用的三个表。

三、使用权限
单独使用event调用SQL查看和创建语句时,用户需要event调用此权限SQL语句要求用户能够执行SQL的权限。Event将权限设置保存在mysql.user表和mysql.db表的Event_priv字段中。

当event和procedure结合使用时,查看和创建存储过程要求用户具有create routine调用存储过程执行时需要权限excute权限,特定于存储过程调用SQL语句要求用户能够执行SQL的权限。
查看EVENT有几种类型的命令:

(1)查询mysql.event表;

(2)通过SHOW EVENTS命令;

(3)通过SHOW FULL EVENTS命令;

(4)通过查询information_schema.events表

(5)SHOW CREATE EVENT。

总之,event推荐用于低使用频率root用户创建和维护。

四、基本语法

4.1 打开定时器
要使event起作用,MySQL的常量GLOBAL event_scheduler必须为on或者是1。
-- 查看是否打开定时器

复制代码 代码如下:

SHOW VARIABLES LIKE event_scheduler;

-- 打开定时器 0:off 1:on

复制代码 代码如下:

SET GLOBAL event_scheduler = 1;

将活动计划设置为0 或OFF当事件规划过程关闭时,不会执行任何新事件,但将执行现有的正在运行的事件直到结束

对于我们的在线环境,使用event时,注意在主库上打开定时器,从库上关闭定时器,event触发所有操作将被记录binlog在主从同步期间启动从库上的计时器可能会导致库卡住。切换到主数据库后,记得打开新主数据库上的计时器。
请特别注意!

4.2 创建事件
CREATE EVENT 的语法如下:
CREATE EVENT
[IF NOT EXISTS] ---------------------------------------------标注1
event_name -----------------------------------------------------
标注2

ON SCHEDULE schedule ------------------------------------标注3
[ON COMPLETION [NOT] PRESERVE] -----------------
标注4
[ENABLE | DISABLE] ----------------------------------------标注5
[COMMENT comment] --------------------------------------
标注6
DO sql_statement -----------------------------------------------*标注7

说明:

标注1:[IF NOT EXISTS]

使用IF NOT EXISTS仅同名event仅当它不存在时才创建,否则被忽略。建议不要使用以确保event已成功创建。

标注2:event_name

名称的最大长度可以是64字节。名称必须是当前名称Dateabase唯一,同一数据库不能具有相同的名称event。

使用event常见任务包括创建表、插入数据、删除数据、清除表和删除表。

为避免命名约定带来的不便,最好具有能够描述整个事件的事件名称。建议的命名约定如下:操作名称_(INTO/FROM_)表名_TIME,例如:
1.     创建每月(清除/删除)fans表:
create(truncate/drop)_table_fans_month;
2.     每天从fans表插入(删除)数据:
insert(delete)_into(from)_fans_day;
标注3:ON SCHEDULE

ON SCHEDULE 有两种方法可以设置计划任务:

  1. AT 用于完成单个计划任务的时间戳。

  2. EVERY 时间单位数 时间单位[STARTS 时间戳] [ENDS时间戳]用于完成重复的计划任务。

在这两种类型的计划任务中,时间戳可以是任意的TIMESTAMP 和DATETIME 数据类型和时间戳需要大于当前时间。

在重复的计划任务中,时间数(单位)可以是任何非空(Not Null时间单位的整数表达式是关键字:YEAR,MONTH,DAY,HOUR,MINUTE 或者SECOND。

提示: 其他时间单位也是合法的,例如:QUARTER, WEEK, YEAR_MONTH,DAY_HOUR,DAY_MINUTE,DAY_SECOND,HOUR_MINUTE,HOUR_SECOND, MINUTE_SECOND不建议使用这些非标准时间单位。

标注4: [ON COMPLETION [NOT] PRESERVE]

ON COMPLETION参数表示"当此事件不再发生时"完成单个计划任务或执行重复的计划任务时ENDS阶段。而PRESERVE的功能是防止事件在完成后执行Drop掉线,建议使用此参数方便查看EVENT具体信息。

标注5:[ENABLE | DISABLE]
参数Enable和Disable指示设置事件的状态。Enable指示系统将执行此事件。Disable指示系统未执行此事件。

您可以使用以下命令关闭或打开事件:

ALTER EVENT event_name  ENABLE/DISABLE
标注6:[COMMENT comment]

注释将显示在元数据中,元数据存储在information_schema表的COMMENT列,最大长度为64个字节。comment表示将注解内容放在单引号之间,建议使用注解来表达更全面的信息。

标注 7: DO sql_statement

DO sql_statement该字段表示event需要执行什么SQL语句或存储过程。那里SQL语句可以是复合语句,例如:
BEGIN
CREATE TABLE test1;//创建表(需要测试)
DROP TABLE test2;//删除表
CALL proc_test1();//调用存储过程
END

使用BEGIN和END标识符将复合SQL语句按执行顺序放置在 之间。答案是肯定的SQL语句有限制,对它们的限制类似于函数Function和触发器Trigger 中对SQL如果你在函数中,对语句的限制是相同的Function 和触发器Trigger 有些不能用于SQL同样,在EVENT它不能用于。具体来说,有以下几点:

LOCK TABLES
UNLOCK TABLES
CREATE EVENT
ALTER EVENT
LOAD DATA

4.3  执行逻辑
For (已建立的活动each event that has been created)
If (事件的状态不是DISABLE)
And (当前时间已打开ENDS时间之前)
And (当前时间已打开STARTS时间之后)
And (自上次执行以来经过的时间)
And (未执行)
Then:
创建新线程
交付事件SQL对新线程的声明
(此线程将在执行完成后自动关闭)

4.4 修改事件
使用ALTER EVENT 修改事件,特别是ALTER语法如下,类似于创建事件的语法:
ALTER EVENT
event_name

ON SCHEDULE schedule
[RENAME TO new_event_name]
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE]
[COMMENT comment]
DO sql_statement

4.5 删除事件
EVENT使用DROP EVENT用于删除已创建的事件的语句,语法如下:

DROP EVENT
[IF EXISTS]
event_name

但是,当事件正在运行时,删除它不会导致事件停止,并且事件将一直执行,直到完成。用DROP USER和DROP DATABASE 该语句还将删除其中包含的事件。

五、常见例子
每秒自动呼叫e_test()存储过程

复制代码 代码如下:

CREATE EVENT IF NOT EXISTS e_test
ON SCHEDULE EVERY 1 SECOND
ON COMPLETION PRESERVE
DO CALL e_test();

每月初一清晨1 点执行STAT()存储过程:

复制代码 代码如下:

CREATE  EVENT  NOT EXISTS  STAT
ON  SCHEDULE  EVERY  1  MONTH  STARTS DATE_ADD(DATE_ADD(DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE())-1 DAY), INTERVAL 1 MONTH),INTERVAL 1 HOUR)
ON  COMPLETION  PRESERVE  ENABLE
DO
BEGIN
CALL STAT();
END

另外:

当为on completion preserve 的时候,当event到期了,event会被disable,但是该event仍将存在
当为on completion not preserve的时候,当event到期时,该event将被自动删除.

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除

热门