欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-02-16 19:51:22
一、使用过程 1.查看当前是否已开启事件计划(调度器)有3种方法: show variables like 'event_scheduler'; sele...

一、使用过程
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 *',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