全部產品
Search
文件中心

PolarDB:PG_CRON

更新時間:Jul 06, 2024

PG_CRON是PostgreSQL 9.5及以上版本中基於CRON的一個簡單的作業發送器,它作為擴充程式在資料庫中運行。PG_CRON的使用方式與常規CRON保持相同的文法,但它允許直接從資料庫安排PostgreSQL命令。

注意事項

  • 舊版本PG_CRON外掛程式可能存在記憶體泄露風險,因此在使用PG_CRON外掛程式之前,請將核心小版本升級至V1.1.19及以上版本。如果不使用PG_CRON外掛程式,則無該風險。
  • 出於安全性考慮,您只能夠通過系統函數來操作定時任務(系統提供了增加和刪除定時任務的功能),普通使用者對於cron.job(PG_CRON定時任務表)只有查看的許可權。請您根據自己的需要選擇函數的使用方法。
  • 資料庫中的定時任務都儲存於預設postgres資料庫中,但是您可以在其它多個資料庫上執行定時任務查詢。
  • 定時任務執行的時間是GMT時間,請注意換算時間。
  • PG_CRON外掛程式預設關閉,由於安全原因,暫時不支援使用者手動建立。如有需要,請前往配額中心,在配額名稱PolarDB PG pg_cron外掛程式使用操作列,單擊申請,申請建立。

關閉外掛程式

您可以在資料庫中執行以下指令碼關閉PG_CRON。

-- 關閉 pg_cron
DROP EXTENSION pg_cron;

使用外掛程式

每一個定時任務都分為定時計劃和定時任務兩個部分。定時計劃規定了使用外掛程式的計劃,例如每隔一分鐘執行一次該任務;定時任務是具體的任務內容,例如select * from some_table。外掛程式提供了一個選擇性參數database,未指定該參數則預設配置postgres資料庫。

以下函數是您可以執行的全部函數,其它操作視為非法操作。

-- 執行一個任務
SELECT cron.schedule('schedule', 'task')

-- 選定資料庫執行任務 
-- 第三個參數不指定即為設定檔中資料庫,預設postgres
SELECT cron.schedule('schedule', 'task', 'my_db')

-- 刪除一個任務
SELECT cron.unschedule(schedule_id)

-- 查看當前工作清單
SELECT * FROM cron.job;

樣本

  • 增加任務項
    -- 周六3:30am (GMT) 刪除到期資料 
    SELECT cron.schedule('30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$);
     schedule
    ----------
           42
    
    -- 每天的 10:00am (GMT) 執行磁碟清理
    SELECT cron.schedule('0 10 * * *', 'VACUUM');
     schedule
    ----------
           43
     
    -- 每分鐘執行 指定指令碼
    SELECT cron.schedule('* * * * *', 'select 1;');
     schedule
    ----------
           44
    
    -- 每個小時的 23分 執行 指定指令碼
    SELECT cron.schedule('23 * * * *', 'select 1;');
     schedule
    ----------
           45
           
    -- 每個月的 4號 執行 指定指令碼
    SELECT cron.schedule('* * 4 * *', 'select 1;');
     schedule
    ----------
           46

    其中,PG_CRON計劃使用標準的CRON文法,*表示每個該時間運行,指定數字則表示僅在這個時間運行,如下所示。

     ┌───────────── 分鐘 (0 - 59)
     │ ┌────────────── 小時 (0 - 23)
     │ │ ┌─────────────── 日期 (1 - 31)
     │ │ │ ┌──────────────── 月份 (1 - 12)
     │ │ │ │ ┌───────────────── 一周中的某一天 (0 - 6) (0 到 6 表示周末到下周六,
     │ │ │ │ │                   7 仍然是周末)
     * * * * *
  • 刪除任務項
    -- 停止、刪除一個任務
    SELECT cron.unschedule(42);
     unschedule
    ------------
              t
  • 查看當前任務
    SELECT * FROM cron.job;
    
     jobid | schedule   |  command  | nodename  | nodeport | database | username | active 
    -------+------------+-----------+-----------+----------+----------+----------+--------
        43 | 0 10 * * * |   VACUUM; | localhost |     5433 | postgres | test     | t