2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > mysql 的事件_一文总结MySQL数据库事件--定时任务实现方式

mysql 的事件_一文总结MySQL数据库事件--定时任务实现方式

时间:2019-05-31 16:06:00

相关推荐

mysql 的事件_一文总结MySQL数据库事件--定时任务实现方式

由于最近在做某些日志表的清理工作,会用到定时任务,所以这里也简单介绍一下mysql如何用事件来实现定时任务。

后面会介绍两个日志表清理实现方案,一种是传统的定时delete,另一种会稍微复杂点,主要是针对比较大型的项目。

一、事件概述

在MySQL 5.1中新增了一个特色功能事件调度器(Event Scheduler),简称事件。

事件(event)是MySQL在相应的时刻调用的过程式数据库对象。一个事件可调用一次,也可周期性的启动,它由一个特定的线程来管理的,也就是所谓的“事件调度器”。

事件和触发器类似,都是在某些事情发生的时候启动。当数据库上启动一条语句的时候,触发器就启动了,而事件是根据调度事件来启动的。由于他们彼此相似,所以事件也称为临时性触发器。事件取代了原先只能由操作系统的计划任务来执行的工作,而且MySQL的事件调度器可以精确到每秒钟执行一个任务,而操作系统的计划任务(如:Linux下的CRON或Windows下的任务计划)只能精确到每分钟执行一次。

二、事件的优缺点

优点:一些对数据定时性操作不再依赖外部程序,而直接使用数据库本身提供的功能。可以实现每秒钟执行一个任务,这在一些对实时性要求较高的环境下就非常实用了。

缺点:定时触发,不可以调用。

三、事件调度器参数

事件由一个特定的线程来管理。启用事件调度器后,拥有SUPER权限的账户执行SHOW PROCESSLIST就可以看到这个线程了。

--查看事件是否开启。SHOWVARIABLESLIKE'event_scheduler';SELECT@@event_scheduler;--全局开启事件调度器SETGLOBALevent_scheduler=ON;--全局关闭事件调度器SETGLOBALevent_scheduler=OFF;--永久开启事件调度器(在f配置文件中添加)#事件调度器启动状态event_scheduler=on

四、创建事件

一条create event语句创建一个事件。每个事件由两个主要部分组成,第一部分是事件调度(eventschedule,表示事件何时启动以及按什么频率启动;

第二部分是事件动作(event action),这是事件启动时执行的代码,事件的动作包含一条SQL语句,它可能是一个简单地insert或者update语句,也可以使一个存储过程或者

benin...end语句块,这两种情况允许我们执行多条SQL。

一个事件可以是活动(打开)的或停止(关闭)的,活动意味着事件调度器检查事件动作是否必须调用,停止意味着事件的声明存储在目录中,但调度器不会检查它是否应该调用。在一个事件创建之后,它立即变为活动的,一个活动的事件可以执行一次或者多次。

相关语法:

CREATE[DEFINER={user|CURRENT_USER}]EVENT[IFNOTEXISTS]event_nameONSCHEDULEschedule[ONCOMPLETION[NOT]PRESERVE][ENABLE|DISABLE|DISABLEONSLAVE][COMMENT'comment']DOevent_body;schedule:ATtimestamp[+INTERVALinterval]...|EVERYinterval[STARTStimestamp[+INTERVALinterval]...][ENDStimestamp[+INTERVALinterval]...]interval:quantity{YEAR|QUARTER|MONTH|DAY|HOUR|MINUTE|WEEK|SECOND|YEAR_MONTH|DAY_HOUR|DAY_MINUTE|DAY_SECOND|HOUR_MINUTE|HOUR_SECOND|MINUTE_SECOND}

说明:

五、事件(定时任务)管理

1. 查询事件

在MySQL中可以通过查询information_schema.events表,查看已创建的事件。

--查看当前所在库的事件showevents;--查看所有事件SELECT*FROMinformation_schema.events;

2. 修改事件

事件被创建之后,还可以使用ALTER EVENT语句修改其定义和相关属性

ALTER[DEFINER={user|CURRENT_USER}]EVENT[IFNOTEXISTS]event_nameONSCHEDULEschedule[ONCOMPLETION[NOT]PRESERVE][ENABLE|DISABLE|DISABLEONSLAVE][COMMENT'comment']DOevent_body;

3. 启动与关闭事件

ALTER EVENT语句可以让一个事件关闭或再次活动。

--启动事件。ALTEREVENTevent_nameENABLE;--关闭事件。ALTEREVENTevent_nameDISABLE;

4. 删除事件

删除已经创建的事件可以使用DROP EVENT语句来实现。

DROPEVENTIFEXISTSevent_name;

六、实例演示

1. 事件+sql

创建名称为event_t1的事件,用于每隔5秒钟向数据表t1(用户信息表)中插入一条数据。

--创建用户信息表CREATETABLEIFNOTEXISTSt1(idINTAUTO_INCREMENTPRIMARYKEYCOMMENT'用户编号',nameVARCHAR(30)NOTNULLCOMMENT'用户姓名',create_timeTIMESTAMPCOMMENT'创建时间')COMMENT='用户信息表';--创建事件CREATEEVENTIFNOTEXISTSevent_t1ONSCHEDULEEVERY5SECONDONCOMPLETIONPRESERVECOMMENT'新增用户信息定时任务'DOINSERTINTOt1(name,create_time)VALUES('hwb',NOW());

2. 事件+存储过程

--创建总表CREATETABLEIFNOTEXISTSt_total(userNumberINTCOMMENT'用户数',createtimeTIMESTAMPCOMMENT'创建时间')COMMENT='总表';--创建名称为t_total的存储过程,用于统计前面表插入的数量CREATEPROCEDUREt_total()BEGINDECLAREn_totalINTdefault0;SELECTCOUNT(*)INTOn_totalFROMt1;INSERTINTOt_total(userNumber,createtime)VALUES(n_total,NOW());END;--创建名称为event_total的事件,用于在每天12点调用存储过程。CREATEEVENTIFNOTEXISTSevent_totalONSCHEDULEEVERY1DAYSTARTSDATE_ADD(DATE_ADD(CURDATE(),INTERVAL1DAY),INTERVAL12HOUR)ONCOMPLETIONPRESERVEENABLEDOCALLt_total();

【编辑推荐】

【责任编辑:赵宁宁 TEL:(010)68476606】

点赞 0

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。