接上篇,ETL的存储过程已经实现,需要手动执行。本文将实现定时自动执行,用Mysql自带的Event定时触发器,仍是熟悉的配方,分三部分总结:理论、实战、总结。

1、Event定时触发器

1.1 增删改查

与存储过程、自定义函数非常相似,不再一一讲解,将有关sql呈现如下:

更详细说明,请查看官方文档:https://dev.mysql.com/doc/refman/8.0/en/sql-data-definition-statements.html

mysql 事件 每天凌晨执行一次 mysql定时器 每天执行_存储过程

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参数。

mysql 事件 每天凌晨执行一次 mysql定时器 每天执行_mysql_02

2.2 插曲

数据库时区为伦敦时间,调整为北京时间。临时调整下,持久调整需要去修改配置文件。




show variables like '%time_zone%'; set session time_zone = '+8:00'; show variables like '%time_zone%';

2.3 补跑重跑数据

补跑重跑数据是常见的问题,一个任务新建,历史的数据要补跑,或者之前任务有bug数据是错的,要重跑数据进行修复。

  • 如果只有几个调用执行,量小,那就直接手动执行,或者没有规律的补跑重跑,也手动执行。
  • 如果量多、或者是非常有规律的补跑(比如最近60天的日报),那就写循环脚本来执行。

mysql 事件 每天凌晨执行一次 mysql定时器 每天执行_数据分析_03

3、总结

(1)结合Mysql的存储过程和定时调度,就实现了简单但能跑起来的一个ETL路径,对于新手和小团队而言,这是非常很方便的。小而美,MVP理念,值得大家借鉴。

(2)调度配置很方便,但n多个任务起来后,配置就很头疼,尤其是复杂的依赖关系。这就需要专门的调度工作,有现成开源的azkaban等方便使用,也可以自己写一个调度工具。