实战mysql存储程序与定时器

  </div>

需求:一个庞大的日志表,现每天做定时统计一天的总数,放另一个表中,方便查看,运营。

旧方案:用脚本写好程序,用linux的crontab定时执行。

本文重点,用mysql定时器定时执行存储程序。

第一步:编写存储程序(需了解基本的存储程序的语法)

  1. create procedure inproc()
  2. begin
  3. declare done int default 0;
  4. declare a,b,c int;
  5. 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;
  6. declare continue handler for sqlstate '02000' set done = 1;
  7. open curl;
  8. repeat
  9. fetch curl into a,b,c;
  10. if not done then
  11. insert into ty.daycount values (null,b,a,c);
  12. end if;
  13. until done end repeat;
  14. close curl;
  15. end
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光标,利用光标直到遍历结果集的作用。

执行这个语句之前要先

  1. delimiter $$
delimiter $$

执行完成后再

  1. delimiter ;
delimiter ;

用show查看是否已经成功

  1. show procedure status like '%%';
show procedure status like '%%';

第二步:开启mysql定时器

如果不是on,就执行

  1. set global event_scheduler=1;
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表示系统不执行该事件。

可以用如下命令关闭或开启事件:

  1. ALTER EVENT event_name  ENABLE/DISABLE
ALTER EVENT event_name  ENABLE/DISABLE

下面是我的实例,每天凌晨一点执行

  1. 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_inproc` ON SCHEDULE EVERY 1 DAY STARTS '2013-09-12 01:00:00' ON COMPLETION PRESERVE ENABLE DO begin call ty.inproc();end

另外的一些例子:

  1. 每天凌晨三点执行
  2. create event event_call_defer
  3. on schedule every 1 day starts date_add(date(curdate() + 1),interval 3 hour)
  4. on completion preserve enable
  5. do
  6. begin
  7. call test.warn();
  8. end
  9. 每个月的一号凌晨1 点执行
  10. CREATE EVENT EVENT2
  11. ON SCHEDULE EVERY 1 MONTH STARTS DATE_ADD(DATE_ADD(DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE())-1 DAY), INTERVAL 1 MONTH),INTERVAL 1 HOUR)
  12. ON COMPLETION PRESERVE ENABLE
  13. DO
  14. BEGIN
  15. CALL STAT();
  16. END
  17. 每个季度一号的凌晨2点执行
  18. CREATE EVENT TOTAL_SEASON_EVENT
  19. 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
  20. HOUR)
  21. ON COMPLETION PRESERVE ENABLE
  22. DO
  23. BEGIN
  24. CALL SEASON_STAT();
  25. END
  26. 每年1月1号凌晨四点执行
  27. CREATE EVENT TOTAL_YEAR_EVENT
  28. ON SCHEDULE EVERY 1 YEAR STARTS DATE_ADD(DATE(CONCAT(YEAR(CURDATE()) + 1,'-',1,'-',1)),INTERVAL 4 HOUR)
  29. ON COMPLETION PRESERVE ENABLE
  30. DO
  31. BEGIN
  32. CALL YEAR_STAT();
  33. 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

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

    <ul style="display:none;">
<li><a href="http://dl2.iteye.com/upload/attachment/0089/9807/f8834690-883c-3c7d-9991-c507b25e53bc.png" target="_blank"><img src="http://dl2.iteye.com/upload/attachment/0089/9807/f8834690-883c-3c7d-9991-c507b25e53bc-thumb.png" class="magplus" title="点击查看原始大小图片"></a></li> <li>大小: 3.2 KB</li>
</ul> <ul style="display:none;">
<li><a href="http://dl2.iteye.com/upload/attachment/0089/9810/66acf95d-0bb0-35a2-9811-82f53d62fe3e.png" target="_blank"><img src="http://dl2.iteye.com/upload/attachment/0089/9810/66acf95d-0bb0-35a2-9811-82f53d62fe3e-thumb.png" class="magplus" title="点击查看原始大小图片"></a></li> <li>大小: 6.8 KB</li>
</ul> <ul>
<li><a href="#" onclick="$$('div.attachments ul').invoke('show');$(this).up(1).hide();return false;">查看图片附件</a></li>
</ul>

2
3
分享到:

  • 2013-10-09 16:31
  • 浏览 6127
  • 评论(0)
  •   <li>分类:<a href="http://www.iteye.com/blogs/category/database">数据库</a></li>
    <li class="last"><a href="http://www.iteye.com/wiki/blog/1953827" target="_blank" class="more">相关推荐</a></li>
    </ul>

参考知识库
    <dl class="dlnewlist">

      <dd><a target="_blank" href="http://lib.csdn.net/base/ai"><img src="http://img.knowledge.csdn.net/upload/base/1479972981201_201.jpg" width="58" height="58" alt=""></a></dd>
<dt>
<a target="_blank" href="http://lib.csdn.net/base/ai" classs="title">人工智能知识库</a>
<span>
<em>10718</em>&nbsp;&nbsp;关注 <i>|</i> <em>521</em>&nbsp;&nbsp;收录
</span>
</dt> </dl> <dl class="dlnewlist"> <dd><a target="_blank" href="http://lib.csdn.net/base/python"><img src="http://img.knowledge.csdn.net/upload/base/1452500783406_406.jpg" width="58" height="58" alt=""></a></dd>
<dt>
<a target="_blank" href="http://lib.csdn.net/base/python" classs="title">Python知识库</a>
<span>
<em>20195</em>&nbsp;&nbsp;关注 <i>|</i> <em>1334</em>&nbsp;&nbsp;收录
</span>
</dt> </dl> <dl class="dlnewlist"> <dd><a target="_blank" href="http://lib.csdn.net/base/javase"><img src="http://img.knowledge.csdn.net/upload/base/1453169124297_297.jpg" width="58" height="58" alt=""></a></dd>
<dt>
<a target="_blank" href="http://lib.csdn.net/base/javase" classs="title">Java SE知识库</a>
<span>
<em>23432</em>&nbsp;&nbsp;关注 <i>|</i> <em>468</em>&nbsp;&nbsp;收录
</span>
</dt> </dl> <dl class="dlnewlist"> <dd><a target="_blank" href="http://lib.csdn.net/base/wechat"><img src="http://img.knowledge.csdn.net/upload/base/1452500582376_376.jpg" width="58" height="58" alt=""></a></dd>
<dt>
<a target="_blank" href="http://lib.csdn.net/base/wechat" classs="title">微信开发知识库</a>
<span>
<em>19022</em>&nbsp;&nbsp;关注 <i>|</i> <em>776</em>&nbsp;&nbsp;收录
</span>
</dt> </dl> </div>
评论

    </div>
posted @
2017-03-06 15:16 
jobs-lgy 
阅读(...) 
评论(...) 
编辑 
收藏

markdown_highlight();

var allowComments = false, cb_blogId = 317248, cb_blogApp = 'jobs-lgy', cb_blogUserGuid = 'f2023aea-afab-e611-845c-ac853d9f53ac';
var cb_entryId = 6510078, cb_entryCreatedDate = '2017-03-06 15:16', cb_postType = 1;
loadViewCount(cb_entryId);
loadSideColumnAd();

var commentManager = new blogCommentManager();
commentManager.renderComments(0);

var googletag = googletag || {};
googletag.cmd = googletag.cmd || [];

googletag.cmd.push(function () {
googletag.defineSlot("/1090369/C1", [300, 250], "div-gpt-ad-1546353474406-0").addService(googletag.pubads());
googletag.defineSlot("/1090369/C2", [468, 60], "div-gpt-ad-1539008685004-0").addService(googletag.pubads());
googletag.pubads().enableSingleRequest();
googletag.enableServices();
});

fixPostBody();
deliverBigBanner();
setTimeout(function() { incrementViewCount(cb_entryId); }, 50); deliverAdT2();
deliverAdC1();
deliverAdC2();
loadNewsAndKb();
loadBlogSignature();
LoadPostCategoriesTags(cb_blogId, cb_entryId); LoadPostInfoBlock(cb_blogId, cb_entryId, cb_blogApp, cb_blogUserGuid);
GetPrevNextPost(cb_entryId, cb_blogId, cb_entryCreatedDate, cb_postType);
loadOptUnderPost();
GetHistoryToday(cb_blogId, cb_blogApp, cb_entryCreatedDate);

实战mysql存储程序与定时器的更多相关文章

  1. 屌炸天实战 MySQL 系列教程(二) 史上最屌、你不知道的数据库操作

    此篇写MySQL中最基础,也是最重要的操作! 第一篇:屌炸天实战 MySQL 系列教程(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:屌炸天实战 MySQL 系列教程(二) 史上最屌.你不 ...

  2. (转)企业Shell实战-MySQL分库分表备份脚本

    本文来自http://www.xuliangwei.com/xubusi/252.html 免费视频讲解见 http://edu.51cto.com/course/course_id-5064.htm ...

  3. Jmeter(七) - 从入门到精通 - 建立数据库测试计划实战<MySQL数据库>(详解教程)

    1.简介 在实际工作中,我们经常会听到数据库的性能和稳定性等等,这些有时候也需要测试工程师去评估和测试,上一篇文章宏哥主要介绍了jmeter连接和创建数据库测试计划的过程,宏哥在文中通过示例和代码非常 ...

  4. 实战-Mysql主从复制

    前言: Mysql内建的复制功能是构建大型高性能应用程序的基础.由于目前mysql的高可用性架构MMM和MHA均建立在复制的基础之上,本文就mysql主从复制进行实战描述,希望对读者提供帮助.之前 服 ...

  5. (转载)sql注入实战 mysql篇

    出现的关键名词有: UNION  SELECT   load_file   hex 为了方便说明我们先创建两个表:hehe和heihei,很明显它们一个拥有2列属性,一个拥有3列属性 ======== ...

  6. mysql事件【定时器】

    一,借鉴[luo奔的蜗牛] 1.创建一张表 create table mytable ( id int auto_increment not null, name ) not null default ...

  7. 实战 MySQL 8.0.17 Clone Plugin(转)

    背景 很神奇,5.7.17 和 8.0.17,连续两个17小版本都让人眼前一亮.前者加入了组复制(Group Replication)功能,后者加入了克隆插件(Clone Plugin)功能.今天我们 ...

  8. CoProcessFunction实战三部曲之三:定时器和侧输出

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  9. 实战mysql分区(PARTITION)

    http://lobert.iteye.com/blog/1955841 前些天拿到一个表,将近有4000w数据,没有任何索引,主键.(建这表的绝对是个人才) 这是一个日志表,记录了游戏中物品的产出与 ...

随机推荐

  1. GO ERR

    o 语言通过内置的错误接口提供了非常简单的错误处理机制. error类型是一个接口类型,这是它的定义: type error interface { Error() string } 我们可以在编码中 ...

  2. BUG搬运工:CSCvp31778-3802 apsw_watchdog: WARNING: System memory is running low

    如下bug主要针对Cisco COS AP比如18.28.38... 主要现象: AP上连关联的终端显示的是信号满格,但是无法访问内网,所有的终端都这样,只有重启AP后才可以解决. 频率: 这种现象有 ...

  3. 【原】Mysql最大连接数

    MySQL最大连接数的默认值是100, 这个数值对于并发连接很多的数据库的应用是远不够用的,当连接请求大于默认连接数后,就会出现无法连接数据库的错误,因此我们需要把它适当调大一些. 在使用MySQL数 ...

  4. ajax的XmlHttpRequest对象常用方法

    onreadystatechange用于检测readyState状态的改变,当readyState的状态发生改变的时候调用回调

  5. Python - 模块中的"if __name__ == '__main__':"

    1.1 如果导入的模块除了定义函数之外还中有可以执行代码,那么Python解释器在导入这个模块时就会执行这些代码. module1.py: def foo(): print('module 1') f ...

  6. Linux - kali Linux重置密码

    1. recovery mode -> E 2. ro -> rw 3. plus init=/bin/bash 4. passwd root

  7. VB.NET中Sub和Function的区别

    function是函数,sub是子程序,都可以传递参数,但函数有返回值,子程序没有 function 可以用自身名字返回一个值,sub 需定义别的变量,用传址方式传回值. Sub 过程与Functio ...

  8. Python 中命令行参数解析工具 docopt 安装和应用

    什么是 docopt? 1.docopt 是一种 Python 编写的命令行执行脚本的交互语言. 它是一种语言! 它是一种语言! 它是一种语言! 2.使用这种语言可以在自己的脚本中,添加一些规则限制. ...

  9. C#多态学习总结

    面向对象编程三大特点  封装 继承 多态.今天我把自己学习多态的过程进行总结 多态 就是 同一个方法在不同情况下,会表选不同的效果(多个形态).在代码上表现就是 同一个父类对象 赋予不同的子类对象 就 ...

  10. 一个Android音频文本同步的英文有声读物App的开发过程

    转发: http://segmentfault.com/a/1190000003498111 “新概念英语”.“可可英语”.“亚马逊的audible有声书”.“扇贝听力”是我目前所知道的实现英文语音和 ...