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何時執行,執行是否成功,執行時長,出錯時的錯誤信息,為管理我們日常調度計划提供很大方便。

 

您可能感興趣的文章:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM