您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

实战mysql储存程序与定时器

2026/2/7 14:55:36发布9次查看
实战mysql存储程序与定时器 需求:一个庞大的日志表,现每天做定时统计一天的总数,放另一个表中,方便查看,运营。 ? 旧方案:用脚本写好程序,用linux的crontab定时执行。 ? 本文重点,用mysql定时器定时执行存储程序。 ? 第一步:编写存储程序(需了解基本
实战mysql存储程序与定时器
需求:一个庞大的日志表,现每天做定时统计一天的总数,放另一个表中,方便查看,运营。
?
旧方案:用脚本写好程序,用linux的crontab定时执行。
?
本文重点,用mysql定时器定时执行存储程序。
?
第一步:编写存储程序(需了解基本的存储程序的语法)
?
create procedure inproc()begin declare done int default 0; declare a,b,c int; declare curl cursor for select ver,date_format(time,'%y%m%d') as dt,count(*) as count from ty.count where time>date_sub(curdate(),interval 1 day) group by ver,dt; declare continue handler for sqlstate '02000' set done = 1; open curl; repeat fetch curl into a,b,c; if not done then insert into ty.daycount values (null,b,a,c); end if; until done end repeat; close curl;end
这个存储程序主要用过了declare定义局部变量,声明curl光标,利用光标直到遍历结果集的作用。
?
?
执行这个语句之前要先
delimiter $$
执行完成后再
?
?
delimiter ;
?
用show查看是否已经成功
?
show procedure status like '%%';
?
?
第二步:开启mysql定时器
如果不是on,就执行
?
set global event_scheduler=1;
不需要重启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表示系统不执行该事件。
?
可以用如下命令关闭或开启事件:
alter event event_name enable/disable
?
下面是我的实例,每天凌晨一点执行
create event `event_call_inproc` on schedule every 1 day starts '2013-09-12 01:00:00' on completion preserve enable do begin call ty.inproc();end
?
另外的一些例子:
每天凌晨三点执行create event event_call_defer on schedule every 1 day starts date_add(date(curdate() + 1),interval 3 hour)on completion preserve enabledobegin call test.warn();end每个月的一号凌晨1 点执行create event event2 on schedule every 1 month starts date_add(date_add(date_sub(curdate(),interval day(curdate())-1 day), interval 1 month),interval 1 hour)on completion preserve enabledo begin call stat(); end 每个季度一号的凌晨2点执行create event total_season_eventon schedule every 1 quarter starts date_add(date_add(date( concat(year(curdate()),'-',elt(quarter(curdate()),1,4,7,10),'-',1)),interval 1 quarter),interval 2hour)on completion preserve enabledo begin call season_stat(); end 每年1月1号凌晨四点执行create event total_year_eventon schedule every 1 year starts date_add(date(concat(year(curdate()) + 1,'-',1,'-',1)),interval 4 hour)on completion preserve enabledo begin call year_stat(); end
?
(本文注重实战,语法等知识请查询相关手册)
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product