全部產品
Search
文件中心

ApsaraDB RDS:定時任務(pg_cron)

更新時間:Oct 30, 2024

RDS PostgreSQL支援pg_cron定時任務外掛程式。該外掛程式基於cron的作業調度,文法與常規cron相同,您可以通過相應的SQL命令直接在資料庫中配置定時任務。

功能簡介

pg_cron是基於cron的作業調度外掛程式,文法與常規cron相同,您可以通過相應的SQL命令直接在資料庫中配置定時任務。更多詳細資料請參見pg_cron

每一個定時任務主要包含定時計劃定時任務內容兩部分,例如每周六淩晨3:30(GMT)刪除events表中到期資料的任務SELECT cron.schedule('30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$);中:

  • 定時計劃30 3 * * 6,表示每周六淩晨3:30(GMT)執行。其使用標準的cron文法,其中*表示任意時間都運行,特定數字表示僅在這個時間時運行

     ┌───────────── 分鐘: 0 ~ 59
     │ ┌────────────── 小時: 0 ~ 23
     │ │ ┌─────────────── 日期: 1 ~ 31
     │ │ │ ┌──────────────── 月份: 1 ~ 12
     │ │ │ │ ┌───────────────── 一周中的某一天 :0 ~ 6,0表示周日。
     │ │ │ │ │                  
     │ │ │ │ │
     │ │ │ │ │
     * * * * *

    您可以在crontab.guru網站中建立和理解pg_cron定時任務的時間設定。

  • 定時任務內容$$DELETE FROM events WHERE event_time < now() - interval '1 week'$$,表示刪除events表中的到期資料。

前提條件

  • 執行個體為RDS PostgreSQL 10或以上版本。

    說明

    暫不支援RDS PostgreSQL 17。

  • 執行個體核心小版本為20230830或以上。

    重要

    20230830核心小版本之前已支援此外掛程式,但為了規範外掛程式管理,提升RDS PostgreSQL在外掛程式側的安全防護,RDS計劃在核心版本迭代中陸續對部分存在安全風險的外掛程式進行最佳化,部分外掛程式在低核心小版本無法建立,更多資訊,請參見【產品/功能變更】RDS PostgreSQL限制建立外掛程式說明

    • 如果您的執行個體核心小版本低於20230830,且已經使用了此外掛程式,則不影響使用。

    • 如果您首次建立或重新建立此外掛程式,請升級核心小版本到最新。

  • 使用該外掛程式前,需要將pg_cron添加到shared_preload_libraries運行參數值中。

    您可以使用RDS PostgreSQL的設定執行個體參數功能,在shared_preload_libraries運行參數值中添加pg_cron。例如,將運行參數值改為'pg_stat_statements,auto_explain,pg_cron'

使用須知

  • 定時任務執行的時間是GMT時間,請注意換算時間。

  • 定時任務都儲存於預設資料庫postgres中,但是您可以在其他資料庫上查詢定時任務。

  • pg_cron外掛程式安裝在cron.database_name參數指定的資料庫中。cron.database_name參數值預設為postgres,如果您需要將pg_cron外掛程式安裝在其他資料庫中,請修改cron.database_name參數值,詳情請參見設定執行個體參數

  • RDS PostgreSQL 10、11、12在20201130核心小版本之前已支援pg_cron外掛程式,然而,由於pg_cron外掛程式已進行升級,建議將核心小版本升級至最新版本。如果您在升級前已在使用pg_cron,請重新建立外掛程式以利用新特性。需要注意的是,重新建立後原有的定時任務將會丟失。

  • 建立和刪除pg_cron外掛程式時,需要使用高許可權帳號,如何建立高許可權帳號請參見建立帳號

使用方法

重要

pg_cron外掛程式安裝在cron.database_name參數指定的資料庫(預設為postgres)中,該外掛程式支援的命令僅限於在該特定資料庫內執行。更多pg_cron外掛程式的用法,請參見pg_cron

  • 建立外掛程式

    CREATE EXTENSION pg_cron;
    說明
    • 僅高許可權帳號可以執行此命令。如何建立高許可權帳號請參見建立帳號

    • 您可以執行SELECT * FROM pg_extension查看已安裝的外掛程式。

  • 建立定時任務

    SELECT cron.schedule('<定時任務名稱>','<定時計劃>', '<定時任務內容>');
    說明

    定時任務名稱可以省略。定時任務設定成功後,返回定時任務ID。

    樣本:

    -- 周六3:30am (GMT) 刪除到期資料。 
    SELECT cron.schedule('30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$);
    
    ----------
    
    -- 每天的10:00am (GMT) 執行磁碟清理。
    SELECT cron.schedule('0 10 * * *', 'VACUUM');
  • 指定資料庫建立定時任務

    SELECT cron.schedule_in_database('<定時任務名稱>', '<定時計劃>', '<定時任務內容>', '<指定資料庫>');
    重要

    定時任務名稱必須填寫,未填寫將導致任務建立失敗。

    如果RDS PostgreSQL核心小版本小於20230530,請使用如下命令。不指定資料庫時會使用cron.database_name參數指定的資料庫(預設為postgres)。

    SELECT cron.schedule('<定時計劃>', '<定時任務內容>', '<指定資料庫>')

    樣本:

    SELECT cron.schedule_in_database('weekly-vacuum', '0 4 * * 0', 'VACUUM', 'some_other_database');
  • 查看當前定時工作清單

    SELECT * FROM cron.job;
  • 刪除某個定時任務

    SELECT cron.unschedule(<定時任務ID>);

    如果您指定了定時任務名稱,也可以通過定時任務名稱刪除該任務。

    SELECT cron.unschedule('<定時任務名稱>');

    樣本:

    -- 通過定時任務ID刪除
    SELECT cron.unschedule(43);
    -- 通過定時任務名稱刪除
    SELECT cron.unschedule('test01');
  • 刪除外掛程式

    DROP EXTENSION pg_cron;
    說明

    僅高許可權帳號可以執行此命令。