时间:2021-07-01 10:21:17 帮助过:12人阅读
需求:一个庞大的日志表,现每天做定时统计一天的总数,放另一个表中,方便查看,运营。 旧方案:用脚本写好程序,用linux的crontab定时执行。 本文重点,用mysql定时器定时执行存储程序。 第一步:编写存储程序(需了解基本的存储程序的语法) Sql代码 creat
需求:一个庞大的日志表,现每天做定时统计一天的总数,放另一个表中,方便查看,运营。
旧方案:用脚本写好程序,用linux的crontab定时执行。
本文重点,用mysql定时器定时执行存储程序。
第一步:编写存储程序(需了解基本的存储程序的语法)
Sql代码
这个存储程序主要用过了declare定义局部变量,声明curl光标,利用光标直到遍历结果集的作用。
执行这个语句之前要先
Sql代码
执行完成后再
Sql代码
用show查看是否已经成功
Sql代码
第二步:开启mysql定时器
如果不是on,就执行
Sql代码
不需要重启mysql
会发现mysql多起了一个daemon进程
(注: 对于我们线上环境来说,使用event时,注意在主库上开启定时器,从库上关闭定时器,event触发所有操作均会记录binlog进行主从同步,从库上开启定时器很可能造成卡库。切换主库后之后记得将新主库上的定时器打开。)
第三步:创建定时任务
语法:
CREATE EVENT 的语法如下:
CREATE EVENT
[IF NOT EXISTS] ---------------------------------------------*标注1
event_name -----------------------------------------------------*标注2
ON SCHEDULE schedule ------------------------------------*标注3
[ON COMPLETION [NOT] PRESERVE] -----------------*标注4
[ENABLE | DISABLE] ----------------------------------------*标注5
[COMMENT 'comment'] --------------------------------------*标注6
DO sql_statement -----------------------------------------------*标注7
;
标注3:ON SCHEDULE
ON SCHEDULE 计划任务,有两种设定计划任务的方式:
1. AT 时间戳,用来完成单次的计划任务。
2. EVERY 时间(单位)的数量时间单位[STARTS 时间戳] [ENDS时间戳],用来完成重复的计划任务。
在两种计划任务中,时间戳可以是任意的TIMESTAMP 和DATETIME 数据类型,时间戳需要大于当前时间。
在重复的计划任务中,时间(单位)的数量可以是任意非空(Not Null)的整数式,时间单位是关键词:YEAR,MONTH,DAY,HOUR,MINUTE 或者SECOND。
提示: 其他的时间单位也是合法的如:QUARTER, WEEK, YEAR_MONTH,DAY_HOUR,DAY_MINUTE,DAY_SECOND,HOUR_MINUTE,HOUR_SECOND, MINUTE_SECOND,不建议使用这些不标准的时间单位。
标注4: [ON COMPLETION [NOT] PRESERVE]
ON COMPLETION参数表示"当这个事件不会再发生的时候",即当单次计划任务执行完毕后或当重复性的计划任务执行到了ENDS阶段。而PRESERVE的作用是使事件在执行完毕后不会被Drop掉,建议使用该参数,以便于查看EVENT具体信息。
标注5:[ENABLE | DISABLE]
参数Enable和Disable表示设定事件的状态。Enable表示系统将执行这个事件。Disable表示系统不执行该事件。
可以用如下命令关闭或开启事件:
Sql代码
下面是我的实例,每天凌晨一点执行
Sql代码
另外的一些例子:
Sql代码