标签分类 技术文章:
当前位置:首页 > Mysql技术文章 > MySQL中定时事件计划

MySQL中定时事件计划的创建详解

  • 发布时间:
  • 作者:码农之家原创
  • 点击:229

这篇文章主要知识点是关于MySQL、定时、事件、事件计划、定时器、详解MySQL用事件调度器Event Scheduler创建定时任务 的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

MySQL王者晋级之路
MySQL王者晋级之路高质量扫描版
  • 类型:MySQL数据库大小:76.5 MB格式:PDF出版:电子工业出版社作者:张甦
立即下载
PHP、MySQL与JavaScript学习手册
  • 类型:PHP大小:76 MB格式:PDF出版:中国电力出版社作者:Robin Nixon
立即下载

更多Mysql相关的学习资源可以参阅 Mysql电子书程序设计电子书 等栏目。

MySQL中定时事件计划

一、使用过程
1.查看当前是否已开启事件计划(调度器)有3种方法:

SHOW VARIABLES LIKE 'event_scheduler';
SELECT @@event_scheduler;
SHOW PROCESSLIST;

 
2. 开启事件计划(调度器)开关有4种方法:

SET GLOBAL event_scheduler = 1;
SET @@global.event_scheduler = 1;
SET GLOBAL event_scheduler = ON;
SET @@global.event_scheduler = ON;

键值1或者ON表示开启;0或者OFF表示关闭;
 
3.关于事件计划的权限:
单独使用event调用SQL语句时,查看和创建需要用户具有event权限,调用该SQL语句时,需要用户具有执行该SQL的权限。Event权 限的设置保存在mysql.user表和mysql.db表的Event_priv字段中。(FLUSH PRIVILEGES;)
当event和procedure配合使用的时候,查看和创建存储过程需要用户具有create routine权限,调用存储过程执行时需要使用excute权限,存储过程调用具体的SQL语句时,需要用户具有执行该SQL的权限。

SELECT HOST,USER,Event_priv FROM mysql.user;

逐步讲解MySQL中定时事件计划的创建

获取当前登陆的用户和数据库:SELECT CURRENT_USER(), SCHEMA();
从Figure1可以知道bfsql@%是没有Event_priv权限的,在该用户下创建事件的时候会出现下面的错误:
Error Code: 1044Access denied for user 'bfsql'@'%' to database 'blog'
如果出现上面的错误,执行下面的SQL就可以给bfsql@%赋予创建Event的权限:

UPDATE mysql.user SET Event_priv = 'Y' WHERE HOST='%' AND USER='bfsql'; 
FLUSH PRIVILEGES; 

最后,你可以通过SHOW GRANTS FOR 'bfsql'@'%';查看所有权限;
 
4.创建事件:
(1)创建事件的语法如下:

CREATE EVENT [IF NOT EXISTS] event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE]
[COMMENT 'comment']
DO sql_statement

(2)创建事件的示例如下:

DELIMITER $$
CREATE EVENT IF NOT EXISTS e_blog
ON SCHEDULE EVERY 30 SECOND
ON COMPLETION PRESERVE
DO BEGIN
CALL MoveBlogData();
END$$
DELIMITER ;

 
DO sql_statement字段表示该event需要执行的SQL语句或存储过程。这里的SQL语句可以是复合语句,使用BEGIN和END标识符将复合SQL语句按照执行顺序放在之间。

--从现在开始每隔九天定时执行 
CREATE EVENT EVENT1 
ON SCHEDULE EVERY 9 DAY STARTS NOW() 
ON COMPLETION PRESERVE ENABLE 
DO 
  BEGIN 
    CALL TOTAL(); 
  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 

 
5.事件开启与关闭:
开启某事件:

ALTER EVENT e_test ON COMPLETION PRESERVE ENABLE;

关闭某事件:

ALTER EVENT e_test ON COMPLETION PRESERVE DISABLE;

二、实例:
mysql定时器是系统给提供了event,而oracle里面的定时器是系统给提供的job。废话少说,下面创建表:

create table mytable (
id int auto_increment not null,
name varchar(100) not null default '',
introduce text not null,
createtime timestamp not null,
constraint pk_mytable primary key(id)
)


创建存储过程,这里的存储过程主要提供给mysql的定时器event来调用去执行:

create procedure mypro()
BEGIN
insert into mytable (name,introduce,createtime) values ('1111','inner mongolia',now());
end;

这里只是简单的写了一下,只是为了说明例子。


紧接着创建mysql的定时器event:

create event if not exists eventJob 
on schedule every 1 second 
on completion PRESERVE
do call mypro();

这里设置为每一秒执行一次

至此所有的准备工作已经写完了,做完这些,mysql要想利用定时器必须的做准备工作,就是把mysql的定时器给开启了:

SET GLOBAL event_scheduler = 1; -- 启动定时器
SET GLOBAL event_scheduler = 0; -- 停止定时器

紧接着还要开启事件:

ALTER EVENT eventJob ON COMPLETION PRESERVE ENABLE;  -- 开启事件
ALTER EVENT eventJob ON COMPLETION PRESERVE DISABLE; -- 关闭事件


SHOW VARIABLES LIKE '%sche%'; -- 查看定时器状态

至此,你去数据库里面的表mytable里面看下,系统会每隔一秒去插入一条数据,嘻嘻,任务完成了。

select * from mytable

详解MySQL用事件调度器Event Scheduler创建定时任务

前言

事件调度器相当于操作系统中的定时任务(如:Linux中的cron、Window中的计划任务),但MySql的事件调度器可以精确到秒,对于一些实时性要求较高的数据处理非常有用。

1. 创建/修改事件(EVENT)

在MySql中,创建一个新的调度器使用CREATE EVENT,其语法规则如下:

CREATE
  [DEFINER = { user | CURRENT_USER }]
  EVENT
  [IF NOT EXISTS]
  event_name
  ON SCHEDULE schedule
  [ON COMPLETION [NOT] PRESERVE]
  [ENABLE | DISABLE | DISABLE ON SLAVE]
  [COMMENT 'comment']
  DO event_body;

在以上语句中,包含以下参数:

     1、event_name - 事件名,可以是任何合的MySql标识符,不能超64个字符。
创建事件时,可以同时指定Schema,语法结构为:schema_name.event_name

     2、schedule - 调度规则,规定事件的执行时间与执行规则。是一个可包含以下值的子语句:

schedule:
  AT timestamp [+ INTERVAL interval] ...
 | EVERY interval
  [STARTS timestamp [+ INTERVAL interval] ...]
  [ENDS timestamp [+ INTERVAL interval] ...]

interval:
  quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
       WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
       DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}

      3、event_body - 事件体,可以是单行SQL语法,或是BEGIN……END语句块

查看已创建的事件,可以使用SHOW语名:

SHOW EVENTS;

事件的修改

对于已存在事件调度器,可以使用ALTER语句进行修改,语法结构如下:

ALTER
  [DEFINER = { user | CURRENT_USER }]
  EVENT event_name
  [ON SCHEDULE schedule]
  [ON COMPLETION [NOT] PRESERVE]
  [RENAME TO new_event_name]
  [ENABLE | DISABLE | DISABLE ON SLAVE]
  [COMMENT 'comment']
  [DO event_body]

事件的开启与关闭本质是使用ALTER语句修改已创建的事件。如,关闭一个事件

ALTER EVENT e_test ON COMPLETION PRESERVE ENABLE;

开启一个事件:

ALTER EVENT e_test ON COMPLETION PRESERVE DISABLE;

一些事件使用示例

一个最简单的示例,将myschema.mytable表的mycol列,每小时自增1:

CREATE EVENT myevent
  ON SCHEDULE 
  AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR
  DO
   UPDATE myschema.mytable SET mycol = mycol + 1;

这样,我们就创建一个名为myevent的事件,它会在事件创建后每小时执行一次。设置的执行规则等价于:

CREATE EVENT myevent
  ON SCHEDULE 
  EVERY 1 HOUR
  STARTS CURRENT_TIMESTAMP
  DO
   UPDATE myschema.mytable SET mycol = mycol + 1;

如果需要间隔一定时间再开启事务,如,1天后开启:

CREATE EVENT myevent
  ON SCHEDULE 
  EVERY 1 HOUR
  STARTS CURRENT_TIMESTAMP + INTERVAL 1 DAY
  DO
   UPDATE myschema.mytable SET mycol = mycol + 1;

DO执行的SQL可以是一个语句块,如:

DELIMITER // 
CREATE EVENT e 
ON SCHEDULE 
  EVERY 5 SECOND 
DO 
BEGIN 
  DECLARE v INTEGER; 
  DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END; 
  SET v = 0; 
  WHILE v < 5 DO 
    INSERT INTO t1 VALUES (0);   
    UPDATE t2 SET s1 = s1 + 1; 
    SET v = v + 1; 
  END WHILE; 
END // 
DELIMITER ; 

2. 事件调度器的配置

2.1 事件调度器状态

要保证创建的事件能正常执行,首先应该开启事件调度器,可以通过以下3种方式查看调度器状态:

SHOW VARIABLES LIKE 'event_scheduler';
SELECT @@event_scheduler;
SHOW PROCESSLIST;

查看某个事件的执行情况:

SELECT * FROM information_schema.EVENTS;

以上会输出当关Schema中所有的事件信息,可以先通过DESC information_schema.EVENTS;查看输出字段,再查看所需要的信息。如,我只想看事件名及最后执行时间:

SELECT EVENT_NAME, LAST_EXECUTED FROM information_schema.EVENTS;

2.2 开启/关闭事件调度器

如果事件调度器未开启,可以通过以下4种方式启用:

SET GLOBAL event_scheduler = 1;
SET @@global.event_scheduler = 1;
SET GLOBAL event_scheduler = ON;
SET @@global.event_scheduler = ON;

1或ON表示设置为开启状态。同样的,如果需要关闭只要将值0或OFF即可。

总结

以上就是在MySQL中用事件调度器Event Scheduler创建定时任务的全部内容,希望本文的内容对大家学习使用MySQL能有所帮助。

以上就是本次给大家分享的关于Mysql的全部知识点内容总结,大家还可以在下方相关文章里找到mysql查询当天、本周,本月、 在OneProxy的基础上实行My、 MySql Date函数用法总结、 等mysql文章进一步学习,感谢大家的阅读和支持。

上一篇:MySQL截取字符串函数sql语句

下一篇:64位Win10系统安装Mysql5.7.11的步骤

展开 +

收起 -

学习笔记
网友NO.650387

在Windows环境下使用MySQL:实现自动定时备份

一、编写备份脚本 rem auther:www.yumi-info.comrem date:20171222rem ******MySQL backup start********@echo offforfiles /p "E:\mysql\MySQL BackUp" /m backup_*.sql -d -30 /c "cmd /c del /f @path"set "Ymd=%date:~0,4%%date:~5,2%%date:~8,2%0%time:~1,1%%time:~3,2%%time:~6,2%""E:\mysql\MySQL Server 5.6\bin\mysqldump" --opt --single-transaction=TRUE --user=root --password=123456 --host=127.0.0.1 --protocol=tcp --port=3306 --default-character-set=utf8 --single-transaction=TRUE --routines --events "yumi_website" "E:\mysql\MySQL BackUp\backup_%Ymd%.sql"@echo onrem ******MySQL backup end******** 这是一段很常见的windows批处理脚本文件,我来简单解释一下其中的关键部分: forfiles /p "E:\mysql\MySQL BackUp" /m backup_*.sql -d -30 /c "cmd /c del /f @path" forfiles 用来对备份目录下的过期备份进行删除。“E:\mysql\MySQL BackUp”是备份文件所在的路径,可以自行修改。“backup_*.sql”指的是该路径下所有以“backup_”开头,以“.sql”作为后缀的数据库备份文件。而后面的数字“30”表示30天过期。 set "Ymd=%date:~0,4%%date:~5,2%%date:~8,2%0%time:~1,1%%time:~3,2%%time:~6,2%" 使用set命令来定义一个名为“Ymd”的变量,这个变量的值就是后面的一大串规则,简单说就是当前的日期和时间 "E:\mysql\MySQL Server 5.6\bin\mysqldump" 这一行命令就是调用MySQL自带的备份工具了,注意这个路径必须写成你自己的“mysqldump.exe”所在的路径,……

网友NO.956796

Mysql下自动删除指定时间以前的记录的操作方法

关于Event:mysql5.1版本开始引进event概念。event既“时间触发器”,与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发。通过单独或调用存储过程使用,在某一特定的时间点,触发相关的SQL语句或存储过程。 首先删除2天以前记录的SQL语句(webserver_monitormemory为表名,time为时间字段): delete From webserver_monitormemory where DATE(time) = DATE(DATE_SUB(NOW(),INTERVAL 2 day)); 创建存储过程: DELIMITER //CREATE PROCEDURE autodel() - BEGIN - delete From webserver_monitormemory where DATE(time) = DATE(DATE_SUB(NOW(),INTERVAL 2 day)); - END - //DELIMITER ; 创建事件,定制每天执行autodel的存储过程: CREATE EVENT `event_auto_del_memorydata` ON SCHEDULE EVERY 1 DAY STARTS '2017-11-20 00:00:00' ON COMPLETION NOT PRESERVE ENABLE DO CALL autodel(); 开启事件计划(调度器)4种方法。键值1或者ON表示开启;0或者OFF表示关闭: SET GLOBAL event_scheduler = 1; SET @@global.event_scheduler = 1; SET GLOBAL event_scheduler = ON; SET @@global.event_scheduler = ON; 查看当前是否已开启事件计划(调度器)3种方法: SHOW VARIABLES LIKE 'event_scheduler';SELECT @@event_scheduler;SHOW PROCESSLIST;​ 事件开启与关闭: ALTER EVENT event_auto_del_memorydata ON COMPLETION PRESERVE ENABLE; //开启某事件ALTER EVENT event_auto_del_memorydata ON COMPLETION PRESERVE DISABLE; //关闭某事件 这个是最简单但是也是……

网友NO.109283

MySQL数据库Event定时执行任务详解

一、背景 由于项目的业务是不断往前跑的,所以难免数据库的表的量会越来越庞大,不断的挤占硬盘空间。即使再大的空间也支撑不起业务的增长,所以定期删除不必要的数据是很有必要的。在我们项目中由于不清理数据,一个表占的空间竟然达到了4G之多。想想有多可怕... 这里介绍的是用MySQL 建立一个定时器Event,定期清除掉之前的不必要事件。 二、内容 #1、建立存储过程供事件调用delimiter//drop procedure if exists middle_proce//create procedure middle_proce()beginDELETE FROM jg_bj_comit_log WHERE comit_time SUBDATE(NOW(),INTERVAL 2 MONTH);optimize table jg_bj_comit_log;DELETE FROM jg_bj_order_create WHERE created_on SUBDATE(NOW(),INTERVAL 3 MONTH);optimize table jg_bj_order_create;DELETE FROM jg_bj_order_match WHERE created_on SUBDATE(NOW(),INTERVAL 3 MONTH);optimize table jg_bj_order_match;DELETE FROM jg_bj_order_cancel WHERE created_on SUBDATE(NOW(),INTERVAL 3 MONTH);optimize table jg_bj_order_cancel;DELETE FROM jg_bj_operate_arrive WHERE created_on SUBDATE(NOW(),INTERVAL 3 MONTH);optimize table jg_bj_operate_arrive;DELETE FROM jg_bj_operate_depart WHERE created_on SUBDATE(NOW(),INTERVAL 3 MONTH);optimize table jg_bj_operate_depart;DELETE FROM jg_bj_operate_login WHERE created_on SUBDATE(NOW(),INTERVAL 3 MONTH);optimize table jg_bj_operate_login;DELETE FROM jg_bj_operate_logout WHERE created_on SUBDATE(NOW(),INTERVAL 3 MONTH);optimize table jg_……

网友NO.186187

PHP使用SWOOLE扩展实现定时同步 MySQL 数据

南宁公司和几个分公司之间都使用了呼叫系统,然后现在需要做一个呼叫通话数据分析,由于分公司的呼叫服务器是在内网,通过技术手段映射出来,分公司到南宁之间的网络不稳定,所以需要把分公司的通话数据同步到南宁。 本身最简单的方法就是直接配置MySQL的主从同步就可以同步数据到南宁来了。但是销售呼叫系统那边的公司不给MySQL权限我们。 所以这个方法只能放弃了。 于是我们干脆的想,使用PHP来实现定时一个简易的PHP定时同步工具,然后PHP进程常驻后台运行,所以首先就先到了一个PHP组件:SWOOLE,经过讨论,分公司的每天半天生成的数据量最大在5000条左右,所以这个方案是可行,就这样干。 我们使用PHP SWOOLE 做一个异步的定时任务系统。 本身MySQL数据库的主从同步是通过解析Master库中的binary-log来进行同步数据到从库的。然而我们使用PHP来同步数据的时候,那么只能从master库分批查询数据,然后插入到南宁的slave库来了。 这里我们使用的框架是 ThinkPHP 3.2 . 首先安装PHP扩展: SWOOLE,因为没有使用到特别的功能,所以这里我们使用pecl来快速安装: pecl install swoole 安装完成后在 php.ini 里面加入 extension="swoole.so" 安装完成后,我们使用 phpinfo() 来检查是否成功了. 安装成功了,我们就来写业务. 服务端 1、首先启动一个……

<
1
>

Copyright 2018-2019 xz577.com 码农之家

版权责任说明