基本概念
从Mysql5.1版本开始引入Event概念。既“时间触发器”,与trigers的时间出发不同,event类似于linux croutad计划任务,用于时间出发。通过单独或调用procedure存储过程使用,在某一特定的时间点,触发相关的sql语句或存储过程。
适用范围
对于每个一段时间就有固定需求的操作,如创建表、删除数据等操作,可以使用event来处理。
使用权限
单独使用event调用SQL语句时,查看和创建需要用户具有event权限。
调用该SQL语句时,需要用户具有执行该SQL的权限。
Event权限的设置保存在mysql.user表和mysql.db表的event_priv字段中。
当event和procedure配合使用的时候,查看和创建存储过程需要用户具有create routine权限
调用存储过程执行时需要使用execute权限,
存储过程调用具体点的sql语句时,需要用户具有执行该sql的权限
查看event命令有如下几种:
1.查询mysql.event表
2.通过 show events 命令
3.通过 show full events 命令
4.通过查询information_schema.events表
5.show create event
基本语法:
开启定时器
要使event起作用,mysql的常量global event_scheduler必须为on或者是1.
--查看是否开启定时器
show variables like 'event_scheduler';
--开启定时器0:off | 1:on
set global event_scheduler = 1;
当关闭时间计划进程的时候,不会有新的事件执行,但现有的正在运行的事件会执行到完毕。
** event所有操作会记录在binlog,所以做主从同步时,master主库应该开启event,而slave从库应该关闭event。
创建事件
create event语法如下:
create event
# 在同名event不存在时创建
[IF NOT EXISTS] //
# event名字,必须是当前db中唯一的。
# 通常命名以 动作名称_(into/from)_表名_time 为规范
event_name
# 计划任务, 有2种设定方式
# 1.时间戳,用来完成单次任务。
# 2.every时间(单位)的数量时间单位[starts时间戳][ends时间戳],用来完成重复的计划任务。
#
# 两种计划任务中,时间戳可以是任意的timestamp和datetime数据类型,时间戳需要大于当前时间。
# 在重复的计划任务中,时间(单位)的数量可以是任意非空(NOT NULL)的整数式
# 时间单位是关键词:YEAR、MONTH、DAT、HOUR、MINUTE、second
# --其他的时间单位也是合法的如:QUARTER,WEEK,YEAR_MONTH,DAY_HOUR,,DAY_MINUTE,DAY_SECOND,HOUR_MINUTE,HOUR_SECOND, MINUTE_SECOND,不建议使用这些不标准的时间单位。
ON SCHEDULE schedule
# 表示"当这个时间不会再发生时候",既当单次计划任务执行完毕后或当重复性的计划任务执行到了ends阶段。而preserve的作用是使事件在执行完毕后不会drop掉,建议使用该参数,以便于查看EVENT具体信息。
# 参数enable和disable表示设定事件的状态。
# enable表示系统将执行这个事件。
# disable表示系统不执行该事件。
# 可以用如下命令关闭或开启事件:
# alter event event_name enable/disable
[ON COMPLETION [NOT] PRESERVE [ENABLE | DISABLE]]
# 注释会出现在元数据中,它存储在information_schema表的comment列,最大长度64字节。
[COMMENT 'comment']
# 表示该event需要执行的sql语句或存储过程。
# 语句可以是复合语句(begin sql end)。
DO sql_statement
* 在复合语句中是不可以使用如下语句的
LOCK TABLES
UNLOCK TABLES
CREATE EVENT
ALTER EVENT
LOAD DATA
实例:
delimiter |
CREATE EVENT e_daily
ON SCHEDULE
EVERY 1 DAY
COMMENT 'Saves total number of sessions then clears the table each day'
DO
BEGIN
INSERT INTO site_activity.totals (time, total)
SELECT CURRENT_TIMESTAMP, COUNT(*)
FROM site_activity.sessions;
DELETE FROM site_activity.sessions;
CALL DEL();
END |
delimiter ;
修改事件:
ALTER EVENT event_name
ON SCHEDULE schedule
[RENAME TO new_event_name]
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE]
[COMMENT 'comment']
DO sql_statement
删除事件:
DROP EVENT [IF EXISTS] event_name
从Mysql5.1版本开始引入Event概念。既“时间触发器”,与trigers的时间出发不同,event类似于linux croutad计划任务,用于时间出发。通过单独或调用procedure存储过程使用,在某一特定的时间点,触发相关的sql语句或存储过程。
适用范围
对于每个一段时间就有固定需求的操作,如创建表、删除数据等操作,可以使用event来处理。
使用权限
单独使用event调用SQL语句时,查看和创建需要用户具有event权限。
调用该SQL语句时,需要用户具有执行该SQL的权限。
Event权限的设置保存在mysql.user表和mysql.db表的event_priv字段中。
当event和procedure配合使用的时候,查看和创建存储过程需要用户具有create routine权限
调用存储过程执行时需要使用execute权限,
存储过程调用具体点的sql语句时,需要用户具有执行该sql的权限
查看event命令有如下几种:
1.查询mysql.event表
2.通过 show events 命令
3.通过 show full events 命令
4.通过查询information_schema.events表
5.show create event
基本语法:
开启定时器
要使event起作用,mysql的常量global event_scheduler必须为on或者是1.
--查看是否开启定时器
show variables like 'event_scheduler';
--开启定时器0:off | 1:on
set global event_scheduler = 1;
当关闭时间计划进程的时候,不会有新的事件执行,但现有的正在运行的事件会执行到完毕。
** event所有操作会记录在binlog,所以做主从同步时,master主库应该开启event,而slave从库应该关闭event。
创建事件
create event语法如下:
create event
# 在同名event不存在时创建
[IF NOT EXISTS] //
# event名字,必须是当前db中唯一的。
# 通常命名以 动作名称_(into/from)_表名_time 为规范
event_name
# 计划任务, 有2种设定方式
# 1.时间戳,用来完成单次任务。
# 2.every时间(单位)的数量时间单位[starts时间戳][ends时间戳],用来完成重复的计划任务。
#
# 两种计划任务中,时间戳可以是任意的timestamp和datetime数据类型,时间戳需要大于当前时间。
# 在重复的计划任务中,时间(单位)的数量可以是任意非空(NOT NULL)的整数式
# 时间单位是关键词:YEAR、MONTH、DAT、HOUR、MINUTE、second
# --其他的时间单位也是合法的如:QUARTER,WEEK,YEAR_MONTH,DAY_HOUR,,DAY_MINUTE,DAY_SECOND,HOUR_MINUTE,HOUR_SECOND, MINUTE_SECOND,不建议使用这些不标准的时间单位。
ON SCHEDULE schedule
# 表示"当这个时间不会再发生时候",既当单次计划任务执行完毕后或当重复性的计划任务执行到了ends阶段。而preserve的作用是使事件在执行完毕后不会drop掉,建议使用该参数,以便于查看EVENT具体信息。
# 参数enable和disable表示设定事件的状态。
# enable表示系统将执行这个事件。
# disable表示系统不执行该事件。
# 可以用如下命令关闭或开启事件:
# alter event event_name enable/disable
[ON COMPLETION [NOT] PRESERVE [ENABLE | DISABLE]]
# 注释会出现在元数据中,它存储在information_schema表的comment列,最大长度64字节。
[COMMENT 'comment']
# 表示该event需要执行的sql语句或存储过程。
# 语句可以是复合语句(begin sql end)。
DO sql_statement
* 在复合语句中是不可以使用如下语句的
LOCK TABLES
UNLOCK TABLES
CREATE EVENT
ALTER EVENT
LOAD DATA
实例:
delimiter |
CREATE EVENT e_daily
ON SCHEDULE
EVERY 1 DAY
COMMENT 'Saves total number of sessions then clears the table each day'
DO
BEGIN
INSERT INTO site_activity.totals (time, total)
SELECT CURRENT_TIMESTAMP, COUNT(*)
FROM site_activity.sessions;
DELETE FROM site_activity.sessions;
CALL DEL();
END |
delimiter ;
修改事件:
ALTER EVENT event_name
ON SCHEDULE schedule
[RENAME TO new_event_name]
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE]
[COMMENT 'comment']
DO sql_statement
删除事件:
DROP EVENT [IF EXISTS] event_name