【MySQL】Event事件与游标

MySQL的事件就像Linux系统上的定时任务,按照设置的时间或者间隔时间执行设置好的任务。

如果用SQLyog一类的写存储过程、触发器或者事件会省事一些,例如SQLyog就会生成一个大致的模板:

 1 DELIMITER $$
 2 CREATE EVENT `report`.`monitor_user4cx` ON SCHEDULE EVERY 15 MINUTE  DO
 3 BEGIN
 4 DECLARE cx_id INT(10);
 5 DECLARE t_query VARCHAR(500);
 6 DECLARE done INT DEFAULT FALSE;
 7 DECLARE cur CURSOR FOR SELECT id FROM information_schema.PROCESSLIST WHERE `USER`=‘cx‘ AND `TIME` > 600 AND `Command`=‘Query‘;
 8 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
 9 OPEN cur;
10 read_loop:LOOP
11 FETCH cur INTO cx_id;
12 IF done THEN
13 LEAVE read_loop;
14 END IF;
15 SELECT t.trx_query,t.trx_started,p.`USER` FROM information_schema.PROCESSLIST p INNER JOIN information_schema.innodb_trx t ON p.id=t.trx_mysql_thread_id WHERE p.id=cx_id INTO @t_query,@t_time,@p_user;
16 INSERT INTO test.monitor_user4cx(`p_id`,`start_time`,`user`,`time`,`query`) VALUES (cx_id,@t_time,@p_user,NOW(),@t_query);
17 KILL cx_id;
18 END LOOP;
19 CLOSE cur;
20 END$$
21 DELIMITER ;

游标的写法:

CREATE PROCEDURE `test`.`new_procedure` ()
BEGIN
  -- 需要定义接收游标数据的变量
  DECLARE a CHAR(16);
  -- 声明游标的结束标志
  DECLARE done INT DEFAULT FALSE;
  -- 将所需数据赋予游标,游标必须定义在变量/条件后,handler前;否则会报错。 -- ERROR 1337 (42000): Variable or condition declaration after cursor or handler declaration  DECLARE cur CURSOR FOR SELECT i FROM test.t;
  -- 将结束标志绑定到游标,如果捕获到not found异常时就会将变量done设置为TRUE,done=TRUE可以当作循环跳出条件
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
  -- 打开游标
  OPEN cur;

  -- 开始循环
  read_loop: LOOP
    -- 提取游标里的数据,这里只有一个,也可以有多个,例如fetch <游标名> into <变量1>,<变量2>
    FETCH cur INTO a;
    -- 声明结束的时候
    IF done THEN
      LEAVE read_loop;
    END IF;

   -- 这里做你想做的循环的事件
    sql;

  END LOOP;
  -- 关闭游标
  CLOSE cur;

END

游标示例:

1、repeat循环(该循环用do while,先执行后判断)

drop procedure if exists test_proce2;
create procedure test_proce2()
begin
    declare temp_id int(11);
    declare temp_time datetime;
    declare isFinished boolean default false;
    declare test_cursor cursor for select id,time from test;
    declare continue handler for not found set isFinished=true;
    open test_cursor;
    repeat
        fetch test_cursor into temp_id,temp_time;
        if not isFinished then
            select concat(concat(temp_id,":"),temp_time);
        end if;
    until isFinished end repeat;
   close test_cursor;
  end  

2、loop循环

 drop procedure if exists test_proce3;
create procedure test_proce3()
begin
    declare temp_id int(11);
    declare temp_time datetime;
    declare isFinished boolean default false;
    declare test_cursor cursor for select id,time from test;
    declare continue handler for not found set isFinished=true;
    open test_cursor;
    test_loop:loop
        fetch test_cursor into temp_id,temp_time;
        if isFinished then
            leave test_loop;
        end if;
        //若该if语句放在fetch后面,该循环为while型;若该if语句紧接在end loop前该循环为do while型。
        select concat(concat(temp_id,":"),temp_time);
    end loop test_loop;
  close test_cursor;
 end  

示例:

定期检查长时间执行的查询,记录并杀掉

DELIMITER $$
CREATE EVENT `report`.`monitor_user4cx` ON SCHEDULE EVERY 15 MINUTE  DO
BEGIN
DECLARE cx_id INT(10);
DECLARE t_query VARCHAR(500);
DECLARE done INT DEFAULT FALSE;
DECLARE cur CURSOR FOR SELECT id FROM information_schema.PROCESSLIST WHERE `USER`=‘cx‘ AND `TIME` > 600 AND `Command`=‘Query‘;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur;
read_loop:LOOP
FETCH cur INTO cx_id;
IF done THEN
LEAVE read_loop;
END IF;
SELECT t.trx_query,t.trx_started,p.`USER` FROM information_schema.PROCESSLIST p INNER JOIN information_schema.innodb_trx t ON p.id=t.trx_mysql_thread_id WHERE p.id=cx_id INTO @t_query,@t_time,@p_user;
INSERT INTO test.monitor_user4cx(`p_id`,`start_time`,`user`,`time`,`query`) VALUES (cx_id,@t_time,@p_user,NOW(),@t_query);
KILL cx_id;
END LOOP;
CLOSE cur;
END$$
DELIMITER ;

部分内容转自:

http://www.cnblogs.com/trying/p/3296793.html

http://blog.csdn.net/willchyis/article/details/7943467

时间: 2024-08-24 19:21:51

【MySQL】Event事件与游标的相关文章

mysql定时任务(event事件)

1.事件简介 事件(event)是MySQL在相应的时刻调用的过程式数据库对象.一个事件可调用一次,也可周期性的启动,它由一个特定的线程来管理的,也就是所谓的“事件调度器”. 事件和触发器类似,都是在某些事情发生的时候启动.当数据库上启动一条语句的时候,触发器就启动了,而事件是根据调度事件来启动的.由于他们彼此相似,所以事件也称为临时性触发器. 事件取代了原先只能由操作系统的计划任务来执行的工作,而且MySQL的事件调度器可以精确到每秒钟执行一个任务,而操作系统的计划任务(如:Linux下的CR

Mariadb/Mysql event使用大全

SHOW VARIABLES LIKE 'event_scheduler';==>查询是否开启了event SET GLOBAL event_scheduler = 1;==>开启了event 设置event_scheduler一直为ON在my.cnf或者my.ini中加上event_scheduler=1或mysqld ... --event_scheduler=1 DROP EVENT IF EXISTS event_name;==>但当一个事件正在运行中时,删除该事件不会导致事件停

mysql Event、存储过程、表命令

Mysql事件调度器(Event Scheduler)类似于定时器,可以在某一个时间点执行一个SQL语句或一个语句块(BEGIN ... END):或者每隔固定间隔重复执行.类似于Linux下的crontab,或Windows下的Task Scheduler. 一.事件调度器的配置 所有事件都是在事件调度线程(event scheduler thread)里面执行的:当提及事件调度器时,通常指该线程.如果用户有PROCESS权限,可以通过SHOW PROCESSLIST命令来查看该线程及其状态:

Mysql数据库事件使用与示例

1 事件简介 事件(event)是MySQL在相应的时刻调用的过程式数据库对象.一个事件可调用一次,也可周期性的启动,它由一个特定的线程来管理的,也就是所谓的"事件调度器". 事件和触发器类似,都是在某些事情发生的时候启动.当数据库上启动一条语句的时候,触发器就启动了,而事件是根据调度事件来启动的.由于他们彼此相似,所以事件也称为临时性触发器. 事件取代了原先只能由操作系统的计划任务来执行的工作,而且MySQL的事件调度器可以精确到每秒钟执行一个任务,而操作系统的计划任务(如:Linu

MySQL的事件调度器使用介绍

MySQL的事件调度器使用介绍 自MySQL5.1.0起,增加了一个非常有特色的功能–事件调度器(Event Scheduler),可以用做定时执行某些特定任务,可以看作基于时间的触发器. 一.开启 事件调度默认是关闭的,开启可执行 SET GLOBAL event_scheduler=1; SET GLOBAL event_scheduler=ON; 或者在my.ini文件中加上event_scheduler=1 或者在启动命令后加上"-event_scheduler=1" 可以通过

saltstack之salt event事件用法

event是一个本地的ZeroMQ PUB Interface,event是一个开放的系统,用于发送信息通知salt或其他的操作系统.每个event都有一个标签.事件标签允许快速制定过滤事件.除了标签之外,每个事件都有一个数据结构.这个数据结构是一个dict类型,其中包含关于事件的信息. 作用:用于监控salt-master执行结果. 一.监听salt event事件脚本 1.1.环境准备 节点 IPsalt-master 192.168.56.41salt-minion 192.168.56.

Event事件详解

首先提到event,先要明白event的产生,也要先明白焦点,什么是焦点.焦点 : 使浏览器能够区分用户输入的对象,当一个元素有焦点的时候,那么他就可以接收用户的输入. 我们可以通过一些方式给元素设置焦点.而并不是所有元素都能够接收焦点的,能够响应用户操作的元素才有焦点.例如: <input type="text" /> <a href="http://www.baidu.com">百度</a> 说到input,平时用的较多的是o

event事件学习小节

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>event事件</title> </head> <body> <script> document.onclick=function(ev){//谷歌火狐的写法,IE9以上支持,往下不支持: var e=ev; consol

trigger()的event事件对象之坑

问题引入,先贴一段有问题的代码,如果你对 trigger()  这个函数了解不透彻,还真看不出这段代码错在哪.完成的功能是样式转换器,想让页面在加载后自行触发点击事件隐藏三个按钮,但是效果如图并没有隐藏按钮们:控制台会报错: target  属性是 undefined ,肯定是 event 这个事件对象没获取到的问题,程序到17行出错停止,这让我感到疑问:自定义触发的事件难道没有event对象吗?. 1 <div id="switcher" class="switche