一、MySQL定時任務生成表
CREATE TABLE `task_schedule` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '任務ID',
`task_name` varchar(255) NOT NULL COMMENT '任務名稱',
`task_detail` varchar(255) DEFAULT NULL COMMENT '任務詳細描述',
`task_cron` varchar(255) NOT NULL COMMENT '任務執行時間表達式',
`task_command` varchar(255) NOT NULL COMMENT '任務執行的命令或SQL語句',
`task_status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '任務狀態,1表示啟用,0表示禁用',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='任務調度表';
首先,我們需要創建一個任務調度表(task_schedule),該表用於存儲需要定時執行的任務。表結構如上所示,其中task_name、task_detail、task_cron和task_command欄位分別為任務名稱、任務詳情描述、任務執行時間表達式(類似linux中的cron表達式)和任務執行的命令或SQL語句。我們需要定時查詢該表,並根據task_cron欄位來判斷是否需要執行對應的任務。
二、MySQL定時更新數據
UPDATE task_schedule SET task_status = 0 WHERE task_cron = '0 0 1 * * *';
使用MySQL定時更新數據十分常見,可以根據需要設置相應的更新時間點和更新的SQL語句。例如上面的例子表示每月1號凌晨0點0分0秒執行一次,將task_status欄位設置為0。
三、MySQL定時任務每天固定時間執行
CREATE EVENT `daily_task`
ON SCHEDULE EVERY 1 DAY STARTS '2022-01-01 00:00:00'
DO BEGIN
UPDATE user SET points = points + 10 WHERE user_type = 'daily';
INSERT INTO log (user_id, points) SELECT id, 10 FROM user WHERE user_type = 'daily';
END;
MySQL提供了事件調度器,可以通過事件來實現每天固定時間執行任務的功能。上面的代碼演示了每天0點0分0秒執行一個任務,將user表中user_type欄位為daily的用戶的points欄位加10,並將相應的操作記錄插入到log表中。
四、Oracle定時任務SQL
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'send_sales_reports',
job_type => 'STORED_PROCEDURE',
job_action => 'ops.send_sales_reports_proc',
start_date => SYSTIMESTAMP,
repeat_interval => 'FREQ=HOURLY;INTERVAL=2',
end_date => NULL,
enabled => TRUE,
comments => 'Job to send sales reports every 2 hours');
END;
Oracle資料庫也提供了調度器,可以通過CREATE_JOB來創建定時任務。上述代碼表示創建一個每兩個小時執行一次的任務,調用ops.send_sales_reports_proc存儲過程。
五、MySQL定時清理數據
CREATE EVENT `clean_history_data`
ON SCHEDULE EVERY 1 MONTH STARTS '2022-01-01 00:00:00'
DO BEGIN
DELETE FROM history_data WHERE create_time < DATE_SUB(NOW(), INTERVAL 6 MONTH);
END;
我們也可以使用MySQL的事件調度器來實現定時清理數據的功能。上面的代碼表示每月1號0點0分0秒執行一次,刪除history_data表中創建時間早於當前時間6個月的數據。
六、MySQL定時器
DELIMITER $$
CREATE PROCEDURE `check_order_status`()
BEGIN
DECLARE done BOOLEAN DEFAULT FALSE;
DECLARE order_id INT(11);
DECLARE cursor_order CURSOR FOR SELECT id FROM `order` WHERE status = 'processing';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cursor_order;
order_loop: LOOP
FETCH cursor_order INTO order_id;
IF done THEN
LEAVE order_loop;
END IF;
UPDATE `order` SET status = 'timeout' WHERE create_time < DATE_SUB(NOW(), INTERVAL 30 MINUTE) AND id = order_id;
END LOOP;
CLOSE cursor_order;
END$$
DELIMITER ;
SET GLOBAL event_scheduler = ON;
CREATE EVENT `check_order_status_event`
ON SCHEDULE EVERY 1 MINUTE STARTS NOW()
DO CALL `check_order_status`();
MySQL定時器也是常見的定時任務實現方式之一。上述代碼演示了一個定時器的作用,每1分鐘執行一次check_order_status存儲過程,根據條件查詢order表中的訂單數據,將訂單狀態更新為timeout。通過定時器,可以實現各種不同類型的定時任務。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/249362.html