mysql调度程序

一、Mysql中event定时任务的相关命令

 

查看event是否启用:

 

    SELECT @@event_scheduler;

      或

 

    SHOW VARIABLES LIKE 'event%';

  

  2. 开启定时任务

    set GLOBAL event_scheduler = 1;

      或
    SET GLOBAL event_scheduler = ON;

 

  3. 建立定时任务:(如果报错,删掉begin end即可)

 

    DROP EVENT IF EXISTS JOB_ALARM;

    CREATE EVENT JOB_ALARM
     ON SCHEDULE EVERY 10 MINUTE
    DO
     BEGIN
      if(date_format(current_time(),'%H')>22 || date_format(current_time(),'%H')<5) THEN
       CALL PRO_ALARM();
      END IF;
    END

  4.建立存储过程

DROP PROCEDURE IF EXISTS PRO_ALARM;

CREATE PROCEDURE PRO_ALARM()
BEGIN
DECLARE userId VARCHAR(32);
#这个用于处理游标到达最后一行的情况
DECLARE s INT DEFAULT 0;
#声明游标cursor_name(cursor_name是个多行结果集)
DECLARE cursor_data CURSOR FOR
SELECT tmp.USER_ID
FROM (
SELECT
e.USER_ID,
MAX(e.TIME_GMT) TIME_GMT
FROM EVENTS e
GROUP BY e.USER_ID
HAVING MAX(e.TIME_GMT) < UNIX_TIMESTAMP() - 60 * 30
AND MAX(e.TIME_GMT) > UNIX_TIMESTAMP() - 60 * 60 * 24) tmp
INNER JOIN EVENTS t ON tmp.USER_ID = t.USER_ID
AND tmp.TIME_GMT = t.TIME_GMT
WHERE TYPE_ID != '34001';
#设置一个终止标记
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET s = 1;
OPEN cursor_data;
#获取游标当前指针的记录,读取一行数据并传给变量a,b
FETCH cursor_data
INTO userId;
#开始循环,判断是否游标已经到达了最后作为循环条件
WHILE s <> 1 DO
INSERT INTO EVENTS_NOTIFICATION VALUES (NULL, SYSDATE(), UNIX_TIMESTAMP(SYSDATE()),
UNIX_TIMESTAMP(SYSDATE()), '00000', userId, '1', '0');
#读取下一行的数据
FETCH cursor_data
INTO userId;
END WHILE;
#关闭游标
CLOSE cursor_data;
END;

二、Mysql Event 调度历史记录

目前的mysql版本没有Event执行历史信息,为方便查看Event是否正常执行以及执行结果,可以通过以下两个步骤来实现

  1.创建作业执行Event历史记录表

CREATE TABLE `mysql`.`t_event_history` (  

  `dbname` VARCHAR(128) NOT NULL DEFAULT '',  
  `eventname` VARCHAR(128) NOT NULL DEFAULT '',  
  `starttime` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',  
  `endtime` DATETIME DEFAULT NULL,  
  `issuccess` INT(11) DEFAULT NULL,  
  `duration` INT(11) DEFAULT NULL,  
  `errormessage` VARCHAR(512) DEFAULT NULL,  
  `randno` INT(11) DEFAULT NULL,  
  PRIMARY KEY (`dbname`,`eventname`,`starttime`),  
  KEY `ix_endtime` (`endtime`),  
  KEY `ix_starttime_randno` (`starttime`,`randno`)  
) ENGINE=INNODB DEFAULT CHARSET=utf8; 

  2.根据以下建模板创建作业

DELIMITER $$
CREATE DEFINER=`root`@`localhost` EVENT `e_test` ON SCHEDULE
#修改以下调度信息
EVERY 1 DAY STARTS '2014-01-03 01:00:00' ON COMPLETION PRESERVE ENABLE DO
BEGIN
DECLARE r_code CHAR(5) DEFAULT '00000';
DECLARE r_msg TEXT;
DECLARE v_error INTEGER;
DECLARE v_starttime DATETIME DEFAULT NOW();
DECLARE v_randno INTEGER DEFAULT FLOOR(RAND()*100001);

INSERT INTO mysql.t_event_history (dbname,eventname,starttime,randno)
#修改下面的作业名(该作业的名称)
VALUES(DATABASE(),'e_test', v_starttime,v_randno);

BEGIN
#异常处理段
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
BEGIN
SET v_error = 1;
GET DIAGNOSTICS CONDITION 1 r_code = RETURNED_SQLSTATE , r_msg = MESSAGE_TEXT;
END;

#此处为实际调用的用户程序过程
CALL test.usp_test1();
END;

UPDATE mysql.t_event_history SET endtime=NOW(),issuccess=ISNULL(v_error),duration=TIMESTAMPDIFF(SECOND,starttime,NOW()), errormessage=CONCAT('error=',r_code,', message=',r_msg),randno=NULL WHERE starttime=v_starttime AND randno=v_randno;

END$$
DELIMITER ;

 

转自:https://www.cnblogs.com/gered/p/11005230.html#_label2

 

posted @ 2021-10-27 14:40  弓长月生三寿  阅读(62)  评论(0)    收藏  举报