全部產品
Search
文件中心

ApsaraDB RDS:定時任務(pg_cron)

更新時間:Jun 19, 2024

RDS PostgreSQL支援pg_cron外掛程式設定定時任務。

前提條件

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

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

    重要

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

    • 如果您在20230830核心小版前已經使用了此外掛程式,則不影響使用。

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

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

    您可以使用RDS PostgreSQL參數設定功能,為shared_preload_libraries參數添加pg_cron。具體操作,請參見設定執行個體參數

背景資訊

pg_cron是基於cron的作業調度外掛程式,文法與常規cron相同,但它可以直接從資料庫執行PostgreSQL命令。

每一個定時任務分為兩部分:

  • 定時計劃

    規定使用外掛程式的計劃,例如每隔1分鐘執行一次該任務。

    定時計劃使用標準的cron文法,其中*表示任意時間都運行,特定數字表示僅在這個時間時運行

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

    例如每周六3:30am(GMT)的文法為:

    30 3 * * 6
  • 任務內容

    使用者具體的任務內容,例如select * from some_table

注意事項

  • 定時任務執行的時間是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,請重新建立外掛程式來使用新的特性,但是重新建立後原有定時任務會丟失。

使用方法

重要

如下使用方法僅適用於核心小版本小於20230530的RDS PostgreSQL,如果您的核心版本大於等於20230530,則pg_cron外掛程式的具體用法,請參見官方文檔

  • 建立外掛程式

    CREATE EXTENSION pg_cron;
    說明

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

  • 刪除外掛程式

    DROP EXTENSION pg_cron;
    說明

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

  • 執行某個任務

    SELECT cron.schedule('<定時計劃>', '<定時任務>')

    樣本

    -- 周六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('* * * * *', 'select 1;');
    
    ----------
    
    -- 每個小時的23分執行指定指令碼。
    SELECT cron.schedule('23 * * * *', 'select 1;');
    
    ----------
    
    -- 每個月的4號執行指定指令碼。
    SELECT cron.schedule('* * 4 * *', 'select 1;');
  • 指定資料庫執行任務

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

    不指定資料庫時會使用設定檔中的預設資料庫postgres。

  • 刪除某個任務

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

    樣本

    SELECT cron.unschedule(43);
  • 查看當前工作清單

    SELECT * FROM cron.job;