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; END4.建立存储过程
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

浙公网安备 33010602011771号