目录

一、创建event事件详解

二、事件调试器

三、事件调度案例


 

一、创建event事件详解

1.基本概念

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

 

2.适用范围

对于每隔一段时间就有固定需求的操作,如创建表,删除数据等操作,可以使用event来处理。

 

3.使用权限

单独使用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.基本语法

4.1 开启定时器

要使event起作用,MySQL的常量GLOBAL event_scheduler必须为on或者是1。

(1)查看是否开启定时器:SHOW VARIABLES LIKE 'event_scheduler';

(2) 开启定时器 :SET GLOBAL event_scheduler = 1;

 

4.2 创建事件

CREATE

CREATE EVENT

[IF NOT EXISTS]

event_name

ON SCHEDULE schedule --------------------------------*标注3

[ON COMPLETION [NOT] PRESERVE] ---- PRESERVE是使事件在执行完毕后不会被Drop掉

[ENABLE | DISABLE] -------------------------------------- 表示设定事件的状态,Disable表示不执行

[COMMENT 'comment'] ---------------------------------- 添加注释,注释会出现在元数据中

DO sql_statement ----------------------------------------- 需要执行的SQL语句或存储过程

 

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.3 修改事件

使用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.4 删除事件

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

DROP EVENT [IF EXISTS] event_name

 

二、事件调试器

1.查看事件调度器状态

SHOW VARIABLES LIKE 'event_scheduler';

SELECT @@event_scheduler;

SHOW PROCESSLIST;

 

2.开启事件调试器

mysql event_scheduler

开启event_scheduler sql指令:

SET GLOBAL event_scheduler = ON;

SET @@global.event_scheduler = ON;

SET GLOBAL event_scheduler = 1;

SET @@global.event_scheduler = 1;

相反,关闭event_scheduler指令:

 

3.关闭事件调度器

SET GLOBAL event_scheduler = OFF;

SET @@global.event_scheduler = OFF;

SET GLOBAL event_scheduler = 0;

SET @@global.event_scheduler = 0;

 

4.查看自动调度事件有哪些

select * from mysql.event

 

三、事件调度案例

1.立即执行

create event event_now  

on schedule  

at now()  

do insert into events_list values('event_now', now()); 

 

2.每5秒执行

CREATE EVENT IF NOT EXISTS event_test1

on schedule  EVERY 5 SECOND 

starts now()   

ON COMPLETION PRESERVE

do call proc_test_02();

 

3.每分执行

create event test.event_minute  

on schedule  

every  1 minute    

do insert into events_list values('event_now', now());  

 

4.每天执行

CREATE EVENT IF NOT EXISTS update_*_event

ON SCHEDULE  every 1 DAY 

STARTS TIMESTAMP(CURRENT_DATE,'00:05:00')

ON COMPLETION PRESERVE ENABLE

DO CALL update_*_proc(); 

 

5.每月执行

每个月的一号凌晨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;

 

6.指定时间差

相差8小时,注意时区

drop EVENT if exists yida_sts.event_ebay_sold_day_trc;

CREATE EVENT IF NOT EXISTS yida_sts.event_ebay_sold_day_trc

ON SCHEDULE  date_add(date(curdate() + 1),interval 8 hour) 

STARTS  TIMESTAMP'2017-01-26 1:35:00'

ON COMPLETION PRESERVE ENABLE

DO CALL yida_sts.yd_ebay_sold_day_trc(0);

 

 

四、自动执行job计划

1.job计划时间设置

每天定时执行 

例如:每天的凌晨1点执行 

Interval => TRUNC(sysdate) + 1 +1/ (24)

每周定时执行 

例如:每周一凌晨1点执行 

Interval => TRUNC(next_day(sysdate,'星期一'))+1/24

每月定时执行 

例如:每月1日凌晨1点执行 

Interval =>TRUNC(LAST_DAY(SYSDATE))+1+1/24

每季度定时执行 

例如每季度的第一天凌晨1点执行 

Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 1/24

每半年定时执行 

例如:每年7月1日和1月1日凌晨1点 

Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24

每年定时执行 

例如:每年1月1日凌晨1点执行 

Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'),12)+1/24

 

2.job计划设置步骤

(1)第一步:提交job计划

-- 每天零晨1点执行: TRUNC(sysdate) + 1 +1/ (24)    

dbms_job.submit(job1, 'proc_jobs_test;', sysdate, 'TRUNC(sysdate) + 1 +1/ (24)');

(2)查询job计划id

select * from user_jobs;

(3)第二步:执行job计划

-- 注:必须执行此命令,设置的job才会被激活执行,否则不会自动调用执行

begin

   dbms_job.run(1019);     -- job_id可以通过 查询得到

end; 

/

 

3.删除一个job

begin

   dbms_job.remove(1019);--和select * from user_jobs; 中的job值对应,看what对应的过程

end;  

/