MySQL存储过程定时任务
一、基本概念
mysql5.1版本开始引进event概念。event既“时间触发器”,与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发。通过单独或调用存储过程使用,在某一特定的时间点,触发相关的SQL语句或存储过程。
二、适用范围
对于每隔一段时间就有固定需求的操作,如创建表,删除数据等操作,可以使用event来处理。
例如:使用event在每月的1日凌晨1点自动创建下个月需要使用的三张表。
三、使用权限
单独使用event调用SQL语句时,查看和创建需要用户具有event权限,调用该SQL语句时,需要用户具有执行该SQL的权限。Event权限的设置保存在mysql.user表和mysql.db表的Event_priv字段中。
当event和procedure配合使用的时候,查看和创建存储过程需要用户具有create routine权限,调用存储过程执行时需要使用excute权限,存储过程调用具体的SQL语句时,需要用户具有执行该SQL的权限。 查看EVENT命令有如下几种:
(1)查询mysql.event表;
(2)通过SHOW EVENTS命令;
(3)通过SHOW FULL EVENTS命令;
(4)通过查询information_schema.events表
(5)SHOW CREATE EVENT。 总之,event的使用频率较低建议使用root用户进行创建和维护。
四、基本语法
4.1 开启定时器
要使event起作用,MySQL的常量GLOBAL event_scheduler必须为on或者是1。
-- 查看是否开启定时器
SHOW VARIABLES LIKE 'event_scheduler';
-- 开启定时器 0:off 1:on
SET GLOBAL event_scheduler = 1;
当你设定事件计划为0 或OFF,即关闭事件计划进程的时候,不会有新的事件执行,但现有的正在运行的事件会执行到完毕
对于我们线上环境来说,使用event时,注意在主库上开启定时器,从库上关闭定时器,event触发所有操作均会记录binlog进行主从同步,从库上开启定时器很可能造成卡库。切换主库后之后记得将新主库上的定时器打开。
请特别注意!
4.2 创建事件
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
说明:
标注1:[IF NOT EXISTS]
使用IF NOT EXISTS,只有在同名event不存在时才创建,否则忽略。建议不使用以保证event创建成功。
标注2:event_name
名称最大长度可以是64个字节。名字必须是当前Dateabase中唯一的,同一个数据库不能有同名的event。
使用event常见的工作是创建表、插入数据、删除数据、清空表、删除表。
为了避免命名规范带来的不便,最好让事件名称具有描述整个事件的能力。建议命名规则如下为:动作名称_(INTO/FROM_)表名_TIME,例如:
1. 每月创建(清空/删除)fans表:
create(truncate/drop)_table_fans_month;
2. 每天从fans表插入(删除)数据:
insert(delete)_into(from)_fans_day;
标注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
标注6:[COMMENT 'comment'] 注释会出现在元数据中,它存储在information_schema表的COMMENT列,最大长度为64个字节。'comment'表示将注释内容放在单引号之间,建议使用注释以表达更全面的信息。
标注 7: DO sql_statement DO sql_statement字段表示该event需要执行的SQL语句或存储过程。这里的SQL语句可以是复合语句,例如:
BEGIN CREATE TABLE test1;//创建表(需要测试一下)DROP TABLE test2;//删除表CALL proc_test1();//
调用存储过程 END
使用BEGIN和END标识符将复合SQL语句按照执行顺序放在之间。当然SQL语句是有限制的,对它的限制跟函数Function和触发器Trigger 中对SQL语句的限制是一样的,如果你在函数Function 和触发器Trigger 中不能使用某些
SQL,同样的在EVENT中也不能使用。明确的来说有下面几个:
LOCK TABLES UNLOCK TABLESCREATE EVENT ALTER EVENTLOAD DATA
4.3 执行逻辑
For (已建立事件each event that has been created)
If (事件的状态非DISABLE)
And (当前时间在ENDS时间之前)
And (当前时间在STARTS时间之后)
And (在上次执行后经过的时间)
And (没有被执行)
Then: 建立一个新的线程
传递事件的SQL语句给新的线程
(该线程在执行完毕后会自动关闭)
4.4 修改事件 使用ALTER EVENT 来修改事件,具体的ALTER语法如下,与创建事件的语法类似:
ALTER EVENTevent_name ON SCHEDULE schedule[RENAME TO new_event_name] [ON COMPLETION [NOT] PRESERVE][ENABLE | DISABLE][COMMENT 'comment'] DO sql_statement
4.5 删除事件 EVENT使用DROP EVENT语句来删除已经创建的事件,语法如下:
DROP EVENT[IF EXISTS] event_name
但当一个事件正在运行中时,删除该事件不会导致事件停止,事件会执行到完毕为止。使用DROP USER和DROP DATABASE 语句同时会将包含其中的事件删除。
五、常用实例
每隔一秒自动调用e_test()存储过程
CREATE EVENT IF NOT EXISTS e_test ON SCHEDULE EVERY 1 SECOND ON COMPLETION PRESERVE DO CALL e_test();
每个月的一号凌晨1 点执行STAT()存储过程:
CREATE EVENT NOT EXISTS STAT 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
六、自己编写的例子
delimiter //use test //drop table if exists demo //create table demo(cid int,createdtime datetime ) //drop procedure if exists insertData //create procedure insertData()begindeclare howmanytimes int;declare counter int default 75;lable:while(3<=4) Doset counter= counter+1;insert into demo(cid,createdtime) values(counter,now());if counter/5=20 thenleave lable;end if;end while;end //drop event if exists e_insertData //create event e_insertDataon schedule every 20 secondon completion preservedo call insertData() //
转自:http://www.jb51.net/article/38319.htm
转载于:https://www.cnblogs.com/xyxy/p/3886739.html
MySQL存储过程定时任务相关推荐
- mysql设置定时任务
联系我吧 http://qq.bishijie1999.top mysql设置定时任务 一. 首先我们要开启 mysql的定时策略 执行 show variables like '%event_sch ...
- Mysql编写定时任务事件
Mysql编写定时任务事件 原文:Mysql编写定时任务事件 场景: 例如:某系统,用户每天只能拥有一次的抽奖机会,抽过后当天就不可再抽,但是过了24:00点后用户就重新拥有一次抽奖机会.像这种需要数 ...
- MySQL实现定时任务
简述 本篇博客主要介绍了MySQL自身实现定时任务. 文章目录 简述 前言 一.存储过程是什么? 二.MySQL实现定时任务 1.创建表 2.导入数据 3.时间调度器 4.存储过程 5.定时任务(默认 ...
- MYSQL存储过程梳理
目录 事件调度器 事件任务 存储过程 错误处理 MySQL 存储过程 if语句 MySQL IF语句语法 MySQL IF ELSE语句 MySQL IF ELSEIF ELSE语句 MySQL I ...
- 常用MySQL函数存储过程_解析MySQL存储过程、常用函数代码
mysql存储过程的概念: 存储在数据库当中可以执行特定工作(查询和更新)的一组SQL代码的程序段. mysql函数的概念: 函数是完成特定功能的SQL语句,函数分为内置函数和自定义函数(user-d ...
- MySQL 存储过程传参之in, out, inout 参数用法
存储过程传参:存储过程的括号里,可以声明参数. 语法是 create procedure p([in/out/inout] 参数名 参数类型 ..) in :给参数传入值,定义的参数就得到了值 ou ...
- Oracle job procedure 存储过程定时任务
Oracle job procedure 存储过程定时任务 oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务. 一.查询系统中的job,可以查询视图 --相关视图 ...
- mysql中leave和_MySQL数据库之Mysql存储过程使用LEAVE实现MSSQL存储过程中return语法
本文主要向大家介绍了MySQL数据库之Mysql存储过程使用LEAVE实现MSSQL存储过程中return语法 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. DELIMITER ...
- MySQL存储过程详解
1. 存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储 ...
- mysql存储过程语法及实例
存储过程如同一门程序设计语言,同样包含了数据类型.流程控制.输入和输出和它自己的函数库. --------------------基本语法-------------------- 一.创建存储过程 c ...
最新文章
- 如何培养一个搞垮团队的Leader?
- nginx+keepalived安装配置(整理中)
- 简述tcp协议三报文握手过程_TCP协议中的三次握手和四次挥手(图解)
- [转]cubemap soft shadow
- VueThink配置
- Hibernate初步
- 如何在linux centos下安装git(转)
- 软件需求分析教程阅读笔记二
- java基础总结03-进制
- 【GIMP教程探索系列】GIMP将照片修改为符合要求的证件照吗,修改尺寸与像素,压缩图像大小
- html5文字游戏引擎,【HTML5 Game】一步步开发一个 TypeShot 的打字游戏
- Java常用算法手册-01算法概述
- win10系统更新时一直停留在重新启动界面的解决方法
- python读书心得体会范文_读书心得体会范文6篇
- 软件 耗电 android OS 系统,六款安卓平台浏览器耗电量实测
- 大数据平台之今日头条采集,今日特卖全自动发布,淘宝达人有好货一键上传
- java实现多态在工资系统中的应用:给出一个根据雇员类型,利用多态性完成工资单计算的程序。
- 我有酒,你有故事吗?
- nginx之root alias proxy_pass测试
- UE5 Oculus Quest 2 VR中设置手柄摇杆移动蓝图
热门文章
- xgboost4j jar包下载
- R-CNN学习笔记1:Selective Search for Object Recognition
- 【论文笔记】基于2-channel network的图片相似度判别-CVPR 2015
- python实现不使用额外空间去除重复元素
- 2021-06-27JSON介绍
- equal java用法_equal,和等号的用法..
- C++ std::multiset 删除 查找 重复元素中的特定元素
- ubuntu定时任务cron 访问网址php
- jpeg 转rgb c 语言_威刚推出SE770G移动固态硬盘 主打高速传输和RGB灯效
- mysql 索引使用不当_MySQL笔记:select默认使用不当索引导致的巨大性能损失问题_MySQL...