由于最近在清理一些日志表,会用到定时任务,所以这里也简单介绍一下mysql是如何使用事件实现定时任务的。后面会介绍两种日志表清理实现,一种是传统的定时删除,一种稍微复杂一点,主要针对比较大的项目。一、事件概述在MySQL5.1中,增加了一个新的特性函数事件调度器(EventScheduler),简称事件。事件是MySQL在相应时刻调用的过程数据库对象。一个事件可以被调用一次,也可以被周期性地调用,由一个特定的线程来管理,这就是所谓的“事件调度器”。事件类似于触发器,因为它们会在某事发生时触发。在数据库上启动语句时触发触发器,并根据计划的事件触发事件。由于彼此之间的相似性,事件也称为短暂触发器。事件代替了只能由操作系统的定时任务执行的工作,MySQL事件调度器每秒可以准确执行一个任务,而操作系统的定时任务(如:Linux或Windows下的CRON)定时任务)只能每分钟准确执行。2、事件的优缺点优点:一些对数据的定时操作不再依赖于外部程序,而是直接使用数据库本身提供的函数。每秒可以执行一个任务,在一些对实时性要求很高的环境下非常实用。缺点:定时触发,不能调用。3.事件调度器参数事件由特定线程管理。启用事件调度程序后,具有SUPER权限的帐户可以通过执行SHOWPROCESSLIST查看此线程。--检查事件是否启用。SHOWVARIABLESLIKE'event_scheduler';SELECT@@event_scheduler;--全局启用事件调度器SETGLOBALevent_scheduler=ON;--全局启用事件调度器SETGLOBALevent_scheduler=OFF;--永久启用事件调度器(在my.cnf配置文件中添加)#Eventschedulerstartupstatusevent_scheduler=on4.创建一个事件createevent语句创建一个事件。每个事件由两个主要部分组成,第一部分是事件时间表(eventschedule,表示事件何时开始,多久开始一次;第二部分是事件动作(eventaction),也就是事件开始时执行的代码,event动作包含一条SQL语句,可能是简单的insert或update语句,也可能是存储过程或benin...end语句块,这两者都允许我们执行多条SQL。一个event可以是一个activity(open)或stopped(closed),active表示事件调度器检查是否必须调用事件动作,stopped表示事件的声明存储在目录中,但调度器不检查是否应该调用。事件创建后立即变为活动状态,活动事件可以执行一次或多次相关语法:CREATE[DEFINER={user|CURRENT_USER}]EVENT[IFNOTEXISTS]event_nameONSCHEDULEschedule[ONCOMPLETION[NOT]PRESERVE][ENABLE|禁用|禁用LAVE][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}解释:5.事件(计划任务)管理1.通过查询information_schema.events表查询MySQL中的事件,查看已创建的事件。--查看当前库的事件showevents;--查看所有事件SELECT*FROMinformation_schema.events;2.修改事件事件创建后,还可以使用ALTEREVENT语句修改其定义和相关属性|DISABLEONSLAVE][COMMENT'comment']DOevent_body;3.启动和关闭事件ALTEREVENT语句可以使事件关闭或再次激活。--开始活动。ALTEREVENTevent_nameENABLE;--关闭事件。ALTEREVENTevent_nameDISABLE;4.删除一个事件你可以使用DROPEVENT语句来删除一个已经创建的事件。DROPEVENTIFEXISTE事件名称;六、实例演示1、事件+sql创建一个名为event_t1的事件,用于每隔5秒向数据表t1(用户信息表)插入一条数据。--创建用户信息表CREATETABLEIFNOTEXISTSt1(idINTAUTO_INCREMENTPRIMARYKEYCOMMENT'用户编号',nameVARCHAR(30)NOTNULLCOMMENT'用户名',create_timeTIMESTAMPCOMMENT'创建时间')COMMENT='用户信息表';--创建事件CREATEEVENTIFNOTEXISTSENTSEvent_t1ONSCHEDULEEVERYLECONDONPRVERP'DOINSERTI,INTOtimet1)VALUES('hwb',NOW());2.事件+存储过程——创建总表CREATETABLEIFNOTEXISTSt_total(userNumberINTCOMMENT'用户数',createtimeTIMESTAMPCOMMENT'创建时间')COMMENT='总表';--创建名为t_total的存储过程,用于统计上一张表的插入次数。event_total事件用于每天12:00调用存储过程。CREATEEVENTIFNOTEXISTEvent_totalONSCHEDULEEVERY1DAYSTARTSDATE_ADD(DATE_ADD(CURDATE(),INTERVAL1DAY),INTERVAL12HOUR)ONCOMPLETIONPRESERVEENABLEDOCALLt_total();
