zoukankan      html  css  js  c++  java
  • mysql定时任务/mysql作业

    转自:https://www.jb51.net/article/138569.htm

    详细参考:https://www.cnblogs.com/qlqwjy/p/7954175.html(事件&任务调度)

    详细参数:https://www.cnblogs.com/langtianya/p/5445528.html

    实现方式:

    第一种是利用Mysql本身实现,制定event定时任务,可以借助Navicat For Mysql或其他数据库开发工具去做;
    第二种实现方式是利用linux的定时任务,这个是利用Linux系统自带任务管理工具实现的。

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

    1.查看event是否启用:

    1
    2
    3
    SELECT @@event_scheduler;
    SHOW VARIABLES LIKE 'event%';

    2.开启定时任务:

    1
    2
    3
    set GLOBAL event_scheduler = 1;
    SET GLOBAL event_scheduler = ON;

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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.建立存储过程:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    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;

    二、利用linux的定时任务

    linux定时任务基本命令:

    查看定时任务:crontab -l
    编辑定时任务:crontab -e

            */10 22-23,0-5 * * *   mysql -u用户名 -p密码 -e "use db_name;CALL PRO_ALARM();"

           或者把use db_name;CALL PRO_ALARM();存到sql脚本中,编辑定时任务如下:

           */10 22-23,0-5 * * *   mysql -u用户名 -p密码 < /application/Job_mysql.sql

     

    三、Mysql Event 调度历史记录

    转自:https://blog.csdn.net/wrh_csdn/article/details/79712778

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

    【3.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;  

    【3.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 ;

    通过查询mysql.t_event_history表,我们就知道event何时执行,执行是否成功,执行时长,出错时的错误信息,为管理我们日常调度计划提供很大方便。

    您可能感兴趣的文章:

  • 相关阅读:
    19、spring注解学习(声明式事务)——spring注解版声明式事务
    Visual C# 2015调用SnmpSharpNet库实现简单的SNMP元素查询
    SNMP协议交互学习-获取udp的udpindatagrams
    LwIP的SNMP学习笔记
    stm32f407使用Keil uV5建立工程日志
    IP unnumbered interface,某个接口不编号,某个接口不分配IP地址
    OSPFv3与OSPFv2协议的比较
    卫星网络-拓扑优化-文献笔记
    卫星轨道相关笔记SGP4
    [20190226]删除tab$记录的恢复6.txt
  • 原文地址:https://www.cnblogs.com/gered/p/11005230.html
Copyright © 2011-2022 走看看