本文实例讲述了mysql的计划任务与事件调度。分享给大家供大家参考,具体如下:
mysql事件是基于预定义的时间表运行的任务,因此有时它被称为预定事件.mysql事件也被称为“时间触发”,因为它是由时间触发的,而不是像触发器一样更新表来触发的.mysql事件类似于UNIX中的cron作业或Windows中的任务调度程序。我们可以在优化数据库表,清理日志,归档数据或在非高峰时间生成复杂的报告的时候使用mysql事件。
mysql使用一个名为事件调度线程的特殊线程来执行所有调度的事件。我们可以通过执行以下命令来查看事件调度程序线程的状态:
显示PROCESSLIST; >之前执行上面查询语句,得到以下结果:
mysql>显示PROCESSLIST; + - - - + - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + | | |用户Id主机| db | | | | |命令时间状态信息 + - - - + - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + localhost: 50405根| | 2 | |零睡眠| | 1966 | |零| localhost: 50406 | 3 |根| | yiibaidb睡眠| | 1964 | |零| localhost: 50407 | 4 |根| | yiibaidb查询| | 0 | |开始显示PROCESSLIST | + - - - + - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + 3行设置 >之前默认情况下,事件调度程序线程未启用。要启用和启动事件调度程序线程,需要执行以下命令:
集全球event_scheduler=> mysql>显示PROCESSLIST; + - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - + | | |用户Id主机| db | | | | |命令时间状态信息 + - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - + localhost: 50405根| | 2 | |零睡眠| | 1986 | |零| localhost: 50406 | 3 |根| | luyaran睡眠| | 1984 | |零| localhost: 50407 | 4 |根| | luyaran查询| | 0 | |开始显示PROCESSLIST | | 5 | event_scheduler | localhost零| |守护进程| 6 |等待> 集全球event_scheduler=; >之前我们知道,事件是一个包含SQL语句的命名对象,创建事件与创建其他数据库对象(如存储过程或触发器)类似,然而,存储过程仅在直接调用时执行;触发器则与一个表相关联的事件(例如插入,更新或删除)事件发生时,可以在一次或更多的规则间隔执行事件时执行触发。那,么事件呢?我们接下来就尝试使用创建事件语句,来创建事件、下面先来看下语法结构:
(如果不存在)event_name创建事件 进度安排 做 event_body >之前我们来详细看下上述sql中的参数的含义:
首先,在创建事件子句之后指定事件名称。事件名称在数据库模式中必须是唯一的。
其次,如期在子句后面加上一个表。如果事件是一次性事件,则使用语法:在时间戳(+时间间隔),如果事件是循环事件,则使用每个子句:每间隔开始时间戳(+间隔)结束时间戳(+间隔)
第三,将语句放在做关键字之后。请注意,可以在事件主体内调用存储过程。如果您有复合SQL语句,可以将它们放在开始结束块中。
我们先来创建一个信息表来做演示:
创建表(如果不存在消息 id AUTO_INCREMENT INT主键, 消息VARCHAR(255)非空, created_at DATETIME非空 ); >之前完事我们来使用创建事件语句创建一个事件:
如果不存在test_event_01创建事件 在安排CURRENT_TIMESTAMP 做 插入消息(消息,created_at) 值(测试MySQL事件1,现在()); >之前检查信息表;会看到有1条记录,这意味着事件在创建时被执行:
mysql>SELECT * FROM消息; + - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - + | | |消息id created_at | + - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - + 事件1 | 2017-08-03 | 1 |测试MySQL 04:23:11 | + - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - + 1行组mysql的计划任务与事件调度实例分析