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