mysql的event详解

一、基本概念

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

 

 

二、适用范围

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

 

 

三、使用权限

单独使用event调用SQL语句时,查看和创建需要用户具有event权限,调用该SQL语句时,需要用户具有执行该SQL的权限。event权限的设置保存在mysql.user表和mysql.db表的event_priv字段中。

 

当event和procedure配合使用的时候,查看和创建存储过程需要用户具有create routine权限,调用存储过程执行时需要使用excute权限,存储过程调用具体的SQL语句时,需要用户具有执行该SQL的权限。

总之,event的使用频率较低建议使用root用户进行创建和维护。

 

 

四、基本语法

1、开启定时器

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

 

即 SET GLOBAL event_scheduler = 1;

 

当你设定事件计划为0或OFF,即关闭事件计划进程的时候,不会有新的事件执行,但现有的正在运行的事件会执行到完毕。

 

对于我们线上环境来说,使用event时,注意在主库上开启定时器,从库上关闭定时器,event触发所有操作均会记录binlog进行主从同步,从库上开启定时器很可能造成卡库。切换主库后记得将新主库上的定时器打开。请特别注意!

 

 

2、参数详细说明

DEFINER: 定义事件执行的时候检查权限的用户。

 

ON SCHEDULE schedule: 定义执行的时间和时间间隔。

 

ON COMPLETION [NOT] PRESERVE: 可选项,默认是ON COMPLETION NOT PRESERVE 即计划任务执行完毕后自动drop该事件;ON COMPLETION PRESERVE则不会drop掉。如果事件每天都跑,即使设置的是ON COMPLETION NOT PRESERVE,计划任务执行完毕后也不会自动drop该事件。

 

ENABLE | DISABLE | DISABLE ON SLAVE: 定义事件创建以后是开启还是关闭,以及在从上关闭。如果是从服务器自动同步主上的创建事件的语句的话,会自动加上DISABLE ON SLAVE。

 

COMMENT 'comment': 定义事件的注释。

 

 

3、常用命令

(1)开启事件

alter event event_name(事件名称) [ON COMPLETION PRESERVE] ENABLE;

 

(2)关闭事件

alter event event_name(事件名称) [ON COMPLETION PRESERVE] DISABLE;

 

(3)删除事件

DROP EVENT [IF EXISTS] event_name(事件名称);

 

(4)更改状态

alter event event_name(事件名称) ENABLE/DISABLE/DISABLE ON SLAVE;

 

(5)将某个event从olddb库移动到newdb库,即重命名event

ALTER EVENT olddb.event_name RENAME TO newdb.event_name;

 

(6)查看数据库当前存在的事件

SELECT * FROM mysql.event;

 

(7)查看事件内容:

SHOW CREATE EVENT event_name(事件名称);

 

 

4、主备切换前后event需要注意的地方

注意:主从使用gtid复制时,从上做alter前切记执行 set session sql_log_bin=0,否则影响主从回切。

 

 

(1)主从切换前,set global event_scheduler=OFF ,可以限制所有event不执行,主从切换后,原主 set global event_scheduler=OFF ,新主 set global event_scheduler=ON 且 所有的event状态需更改为 ENABLED,即ALTER EVENT EVENT_NAME ENABLE。

(2)主从关系存在时(默认 event_scheduler=OFF ),创建event,主上状态为 ENABLED,从上状态为 SLAVESIDE_DISABLED,此时event没有执行,set global event_scheduler=ON 后,定时器处于触发阶段,达到条件就可以执行(比如设置的是半个小时执行一次,那半个小时后就会执行)。

 

 

(3)主从切换后,新主上的 event_scheduler 状态依然是 SLAVESIDE_DISABLED,事件不会执行,set global event_scheduler=ON 后,还是不会执行,需要手动执行 ALTER EVENT EVENT_NAME ENABLE 后该 event 才会执行。

 

 

(4)主库上有event,如果需要拿主库的物理备份来恢复从库,主和从的event状态会保持一致(主如果是enable,从也是enable),即控制event是否会执行,依赖于参数 event_scheduler。

 

 

(5)主从关系中,从上的 event_scheduler=OFF 或者 从上event状态为 SLAVESIDE_DISABLED 或者 DISABLE ,则该event都不会执行。

 

 

(6)只有 event_scheduler=ON 且 event状态为 ENABLED ,该event才会执行。

 

 

(7)当主从关系存在,主上做 ALTER EVENT EVENT_NAME ENABLE/DISABLE,从上会自动变更为 SLAVESIDE_DISABLED。

 

posted @ 2022-11-10 11:09  wq9  阅读(999)  评论(0)    收藏  举报