MySQL定時任務的實現

一、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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 17:12
下一篇 2024-12-12 17:12

相關推薦

  • 如何修改mysql的埠號

    本文將介紹如何修改mysql的埠號,方便開發者根據實際需求配置對應埠號。 一、為什麼需要修改mysql埠號 默認情況下,mysql使用的埠號是3306。在某些情況下,我們需…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Python操作MySQL

    本文將從以下幾個方面對Python操作MySQL進行詳細闡述: 一、連接MySQL資料庫 在使用Python操作MySQL之前,我們需要先連接MySQL資料庫。在Python中,我…

    編程 2025-04-29
  • Saturn 定時任務用法介紹

    本文將從以下幾個方面對Saturn定時任務進行詳細的闡述: 一、Saturn 定時任務簡介 Saturn是一個分散式任務調度系統,支持在線添加、修改定時任務,支持多種任務類型,如J…

    編程 2025-04-29
  • MySQL遞歸函數的用法

    本文將從多個方面對MySQL遞歸函數的用法做詳細的闡述,包括函數的定義、使用方法、示例及注意事項。 一、遞歸函數的定義 遞歸函數是指在函數內部調用自身的函數。MySQL提供了CRE…

    編程 2025-04-29
  • MySQL bigint與long的區別

    本文將從數據類型定義、存儲空間、數據範圍、計算效率、應用場景五個方面詳細闡述MySQL bigint與long的區別。 一、數據類型定義 bigint在MySQL中是一種有符號的整…

    編程 2025-04-28
  • 如何在dolphinscheduler中運行chunjun任務實例

    本文將從多個方面對dolphinscheduler運行chunjun任務實例進行詳細的闡述,包括準備工作、chunjun任務配置、運行結果等方面。 一、準備工作 在運行chunju…

    編程 2025-04-28
  • MySQL左連接索引不生效問題解決

    在MySQL資料庫中,經常會使用左連接查詢操作,但是左連接查詢中索引不生效的情況也比較常見。本文將從多個方面探討MySQL左連接索引不生效問題,並給出相應的解決方法。 一、索引的作…

    編程 2025-04-28
  • CentOS 7在線安裝MySQL 8

    在本文中,我們將介紹如何在CentOS 7操作系統中在線安裝MySQL 8。我們會從安裝環境的準備開始,到安裝MySQL 8的過程進行詳細的闡述。 一、環境準備 在進行MySQL …

    編程 2025-04-27
  • 如何使用MySQL欄位去重

    本文將從多個方面為您詳細介紹如何使用MySQL欄位去重並給出相應的代碼示例。 一、SELECT DISTINCT語句去重 MySQL提供了SELECT DISTINCT語句,通過在…

    編程 2025-04-27

發表回復

登錄後才能評論