接上篇,ETL的存储过程已经实现,需要手动执行。本文将实现定时自动执行,用Mysql自带的Event定时触发器,仍是熟悉的配方,分三部分总结:理论、实战、总结。
1、Event定时触发器
1.1 增删改查
与存储过程、自定义函数非常相似,不再一一讲解,将有关sql呈现如下:
更详细说明,请查看官方文档:https://dev.mysql.com/doc/refman/8.0/en/sql-data-definition-statements.html
1.2 定时
2种定时方式,每隔多久执行与到固定时间点执行。
-- 每隔多久,every 数字 时间单位EVERY 5 SECOND -- every 还还与starts\ends组合,从什么时候开始,上面没有starts相当于立即开始every 1 minute starts timestamp('时间')-- 每个月的一号凌晨 1 点执行on schedule every 1 month starts date_add(date_add(date_sub(curdate(),interval day(curdate())-1 day),interval 1 month),interval 1 hour);-- 每个季度一号的凌晨1点执行on 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 1 hour);-- AT 时间戳,用来完成单次的计划任务。
1.3 查看执行日志
后续在DBA的dashboard实现再补充。
2、实战
将昨天的报表ETL存储过程,定时在每天晚上2点执行。
发现昨天的一个bug,在调用p_se时的参数写死了,应该是动态传入存储过程的I_day和I_rt参数。
2.2 插曲
数据库时区为伦敦时间,调整为北京时间。临时调整下,持久调整需要去修改配置文件。
show variables like '%time_zone%';set session time_zone = '+8:00';show variables like '%time_zone%';
2.3 补跑重跑数据
补跑重跑数据是常见的问题,一个任务新建,历史的数据要补跑,或者之前任务有bug数据是错的,要重跑数据进行修复。
如果只有几个调用执行,量小,那就直接手动执行,或者没有规律的补跑重跑,也手动执行。
如果量多、或者是非常有规律的补跑(比如最近60天的日报),那就写循环脚本来执行。
3、总结
(1)结合Mysql的存储过程和定时调度,就实现了简单但能跑起来的一个ETL路径,对于新手和小团队而言,这是非常很方便的。小而美,MVP理念,值得大家借鉴。
(2)调度配置很方便,但n多个任务起来后,配置就很头疼,尤其是复杂的依赖关系。这就需要专门的调度工作,有现成开源的azkaban等方便使用,也可以自己写一个调度工具。
(3)文章建议按照专栏系列看,会循序渐进,是按照路径来的。已整理好,点击下方链接前往:
或许能用上:【一点分享】Mysql合集,基础入门、进阶升级、用作ETL等场景都适用。
若对您有帮助,请关注之前文章和后续文章。