`

实战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 enable
do
begin
    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 ENABLE
DO
 BEGIN
     CALL STAT();
 END
 
每个季度一号的凌晨2点执行
CREATE EVENT TOTAL_SEASON_EVENT
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 2
HOUR)
ON COMPLETION PRESERVE ENABLE
DO
 BEGIN
     CALL SEASON_STAT();
 END
 

每年1月1号凌晨四点执行
CREATE EVENT TOTAL_YEAR_EVENT
ON SCHEDULE EVERY 1 YEAR STARTS DATE_ADD(DATE(CONCAT(YEAR(CURDATE()) + 1,'-',1,'-',1)),INTERVAL 4 HOUR)
ON COMPLETION PRESERVE ENABLE
DO
 BEGIN
     CALL YEAR_STAT();
 END

 

(本文注重实战,语法等知识请查询相关手册)

  • 大小: 3.2 KB
  • 大小: 6.8 KB
2
3
分享到:
评论

相关推荐

    疯狂Java实战演义参考书目及其源码;

    《疯狂Java实战演义》是一本深受Java爱好者欢迎的实战指南,它涵盖了众多实用的Java编程实例,旨在帮助读者深入理解和掌握Java技术。这个压缩包包含的源代码正是书中各个章节示例的实现,让我们逐一解析这些实战项目...

    软件开发技术实战方案(企业培训).docx

    异常处理是Java编程中的重要组成部分,它允许程序优雅地处理错误情况,而集合类如ArrayList和HashMap则是存储和管理数据的关键工具。IO技术涉及文件读写和网络通信,对于任何系统级别的开发都至关重要。JDBC则用于...

    flowable实战教程.pdf

    - 连接MySQL数据库是Flowable运行的必要步骤,可以存储流程实例、任务等信息。 - 接口分析有助于理解Flowable如何与外部系统交互,包括部署流程、启动流程实例等操作。 3. **Flowable-UI** - Flowable-UI是其...

    戴儒锋博客配套程序_2任务管理系统

    1. 数据存储:任务数据通常会存储在数据库中,如SQLite或MySQL。Python中的sqlite3模块可以方便地与SQLite数据库进行交互,而pymysql或MySQLdb则用于连接MySQL。系统可能实现了增删改查(CRUD)操作,用于创建、更新...

    跟着《Python爬取疫情实战:Flask》所做的 web 项目.zip

    【标题】"跟着《Python爬取疫情实战:Flask》所做的 web 项目"是一个基于Python编程语言和Flask框架开发的实战项目,旨在教授如何利用Python进行数据爬取并构建Web应用来展示疫情数据。该项目可能包括了从互联网上...

    Activiti in Action

    - **DB**:Activiti支持多种数据库管理系统,如MySQL、Oracle等,用于存储流程实例和任务等相关数据。 #### 实战案例分析 以XML格式为例,下面是一个简单的流程定义示例: ```xml ``` 这个例子定义了...

    Linux C_C++后端服务器架构开发1

    4. **中间件开发**:深入学习MySQL、Redis、Nginx和MongoDB等常用中间件,理解其工作原理和优化技巧,如MySQL的索引原理、事务处理、TiDB分布式数据库的存储引擎和集群方案。 5. **开源框架**:探讨如skynet、TARS...

    南京科迅教育Android开发课程.docx

    - **数据持久化**:掌握SharedPreferences的使用,实现数据的存储与读取。 - **ContentProvider**:了解如何使用ContentProvider实现跨应用数据共享。 ##### 阶段五:Android中级 - **Activity生命周期**:深入学习...

    Android数据库出题APP.zip

    - **JDBC API**:Java中的数据库连接接口,允许Java程序与各种类型的数据库进行交互。 - **数据库驱动**:实现JDBC接口的具体数据库厂商驱动,如MySQL、SQLite等的JDBC驱动。 - **数据库操作**:包括建立连接、...

    WEB学习路线完整版教程.docx

    - 使用定时器,实现延迟或周期性执行任务。 - 掌握正则表达式和时间对象,处理字符串和数据验证。 - 学习BOM(浏览器对象模型),管理窗口、历史和位置等。 7. jQuery框架: - 了解jQuery的优势,如简化DOM操作...

    嵌入式综合项目-STM32F407基于ARM Cortex-M4处理器,QT5.9.9客户端,TCP,MQTT+文档说明.zip

    嵌入式综合项目-STM32F407基于ARM Cortex-M4处理器,QT5.9.9客户端,TCP、MQTT通信,JSON通信规则,云服务器Linux操作系统,MySQL数据存储转发源码+文档说明 下位机: STM32F407裸机开发:开发环境前提需要向ESP...

    java面试题综合

    8. 创建存储过程:使用SQL语句在数据库中创建,例如在MySQL中使用CREATE PROCEDURE命令。 9. Struts与Spring整合:涉及Action类的配置、依赖注入以及Spring的AOP用于拦截器。 10. MVC模式:模型-视图-控制器架构,...

    Activiti源码包

    Activiti 可以轻松集成到Spring、JEE等框架中,支持多种数据库(如MySQL、Oracle等),并可通过容器(如Tomcat、Jetty)部署。 通过深入研究“Activiti-master”源码包,开发者不仅可以掌握Activiti的内部工作机制...

    Java日程管理——万年行事历源代码

    Java提供了多种数据库连接选项,如JDBC(Java Database Connectivity)接口,可以与各种关系型数据库(如MySQL、SQLite)进行交互。开发者可能使用PreparedStatement和ResultSet对象来执行SQL查询,存储和检索事件...

    TIM245-Project:一个课程项目

    3. **数据存储**:可能涉及到使用数据库(如MySQL、MongoDB)或文件系统来存储爬取的数据,需要理解基本的数据库操作和文件I/O。 4. **异常处理**:Java的异常处理机制对于确保爬虫程序的健壮性至关重要,需要学会...

Global site tag (gtag.js) - Google Analytics