实战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 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
?
(本文注重实战,语法等知识请查询相关手册)
软文情感网还为您提供以下相关内容希望对您有帮助:
mysql 定时器怎么写判断语句
1.查看是否开启evevt与开启evevt。1.1、MySQL evevt功能默认是关闭的,可以使用下面的语句来看evevt的状态,如果是OFF或者0,表示是关闭的。show VARIABLES LIKE '%sche%';1.2、开启evevt功能 SET GLOBAL event_scheduler = 1;2.创建定时器的过程 2.1、创建测试表test
Swoole和Workerman的消息订阅与发布在PHP与MySQL中的应用场景
与MySQL结合的消息队列场景通过数据库作为消息存储中间层,Swoole和Workerman可实现跨进程/服务的消息订阅与发布。Swoole示例代码中,onReceive回调将接收到的数据插入MySQL的message_queue表,完成消息入队;定时器每秒查询表中最旧消息,处理后删除,实现出队逻辑。此模式适用于分布式系统解耦、延迟任务处理等场...
关于数据库数据自动更改的程序编写(网站程序是PHP+MYSQL)
这样就能保证每次程序取到的值和数据库自动更改的情况下是一样的。高级的数据库管理软件(比如Oracle)有计划任务这一项,可以在那里头设置一般的就只能借助第三方软件了开个定时器在服务器上执行命令行调用计划任务php可以调用服务器的命令行你可以考虑借助第三方软件来控制你那数据变更!
mysql insert中使用select
在描述字集中,readset、writeset和exceptset分别表示需要内核测试读、写和异常条件的描述字。如果对某一个条件不感兴趣,可以将其设为NULL。当三个指针都为NULL时,可以得到一个比sleep()函数更为精确的定时器,因为sleep()以毫秒为最小单位,而这个以微秒为单位。select语句使用描述字集,通常是一个整...
mysql定时器的recurring什么意思
/*开启功能*/ SET GLOBAL event_scheduler = ON;DELIMITER // DROP EVENT IF EXISTS `eventlog`;CREATE EVENT IF NOT EXISTS `eventlog`ON SCHEDULE EVERY 1 DAY STARTS TIMESTAMP(CURRENT_DATE,'09:00:00')ON COMPLETION PRESERVE ENABLE DO ...
mysql workbench怎么用
Data Export/Restore 数据库的导入导出和恢复功能 数据导出的操作:可以选择要导出的数据库和数据表,已经导出选项。这里的导出选项有 导入到一个文件夹中每个表对应一个sql脚本文件还是所有表导入到一个sql文件中,是否丢弃存储过程,是否丢弃Event定时器,是否清空数据 数据导入操作:数据导入操作只有两个...
JNPF搭建指南 | 原来软件开发根本不需要会编码(看我10分钟应用上线...
一、注册与登录 主页地址:尝试体验JNPF平台(图片为示例,实际需访问官方网址)注册过程:简单快捷,只需填写基本信息即可。登录:支持Java及.Net两个版本,根据个人偏好选择。登录后,系统会自动浮现账号信息,方便后续操作。二、开启体验环境 登录后,可直接开启体验环境,开始你的低代码开发之旅。三、...
最美浙江大学计算机教授: Python视频教程,免费系统又经典!不香么?_百 ...
进阶阶段:包括并发编程、网络通信、MySQL、Linux、正则表达式等知识,提升学习者在多线程编程、网络编程、数据库操作、系统操作和文本处理等方面的能力。前端开发:涉及html基本标签、css样式、css浮动和定位、js基础、js对象和函数、js定时器和DOM、js事件响应、使用jquery、jquery动画特效、Ajax异步网络请求等...
Qt模块/Qt开发应用程序类型/Qt未来主要市场/Qt6功能普及
Qt模块Qt是一个跨平台的应用程序开发框架,提供了丰富的模块和工具来开发各种类型的应用程序。其核心模块包括但不限于:QtCore:提供了基础的非GUI功能,包括线程、文件和目录操作、定时器、事件处理等。QtGui:提供了图形界面相关的功能,包括窗口管理、绘图、字体、颜色、图片处理等。QtWidgets:提供了一...
django的网页如何定时弹出窗口(2023年最新解答)
如何在django中让放定时器启动版本弧敞岗缎瞢等哥劝工滑2.子程序__启动窗口_将被销毁窗口1._按钮1_被单击()这样写就可以了!这个的意思就是,启动窗口关闭时,,让窗口1执行它按钮1被单击的命令!~如果你认可我的回答,请及时点击【采纳为满意回答】按钮~~手机提问...怎么在pycharm中使用django...