全部產品
Search
文件中心

AnalyticDB:pg_cron

更新時間:Dec 20, 2025

AnalyticDB for PostgreSQL的定時任務,支援在指定時間點執行批處理任務,如定時更新資料、備份資料或清理到期資料等,能夠確保任務按照預定計划進行,避免遺漏或延遲,節省時間和人力成本,實現自動準確高效的任務執行,提升系統的效率和可管理性。

功能介紹

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

定時任務主要分為定時計劃和任務內容兩個部分,具體介紹如下:

  • 任務內容:用於指定該任務的具體內容,例如VACUUM

  • 定時計劃:用於規定任務的時間計劃,例如每隔一分鐘執行一次該任務。

    定時計劃使用標準的cron文法,文法如下:

     ┌───────────── 分鐘 (取值為0 - 59)
     │ ┌────────────── 小時 (取值為0 - 23)
     │ │ ┌─────────────── 日期 (取值為1 - 31)
     │ │ │ ┌──────────────── 月份 (取值為1 - 12)
     │ │ │ │ ┌───────────────── 一周中的一天 (取值為0 - 6,0表示周日)
     │ │ │ │ │
     │ │ │ │ │
     │ │ │ │ │
      *  *  *  *  *
    • *表示任意時間都可以運行。

    • 特定數字表示僅在這個時間運行。

    • ,表示分隔多個指定時間。

    • -表示時間範圍。

    • /表示範圍間隔。

    建立或預覽定時計劃,請參見Crontab.guru

    樣本如下:

    • 每周六3:30 AM(GMT):

      30 3 * * 6
    • 每月1號和30號1:45 AM(GMT):

      45 1 1,30 * *
    • 每周一至周五的3:00 AM (GMT):

      00 3 * * 1-5
    • 從8點(GMT)到20點(GMT),每兩小時整點:

      0 8-20/2 * * *

注意事項

  • 定時任務執行的時間是GMT或UTC時間,在使用時注意換算本地時間。

  • 定時任務都儲存於預設資料庫postgres中,僅支援在資料庫postgres中查詢定時任務。

  • 如果執行個體版本低於v6.3.6.0(AnalyticDB PostgreSQL 6.0版執行個體)、v7.0.3.0(AnalyticDB PostgreSQL 7.0版執行個體)或v2.0.0.1(AnalyticDB PostgreSQL版Serverless模式執行個體),本文中介紹的部分功能可能無法使用。如需使用本文中的所有功能,建議您升級執行個體核心小版本。升級執行個體的核心版本,請參見版本升級

安裝或刪除外掛程式

安裝外掛程式

pg_cron外掛程式為預設安裝外掛程式,建立AnalyticDB for PostgreSQL執行個體後自動安裝,無需手動安裝。

刪除外掛程式

pg_cron外掛程式目前存在核心功能依賴,無法刪除。

添加定時任務

添加定時任務

文法如下:

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

樣本如下:

  • 周六3:30 AM(GMT)刪除到期資料:

    SELECT cron.schedule('30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$);
  • 每天的10:00 AM(GMT)執行函數test:

    SELECT cron.schedule('0 10 * * *', 'select test()');
  • 每分鐘執行指定SQL:

    SELECT cron.schedule('* * * * *', 'select 1');
  • 每月1號和30號以及每周六和周日的2:30 AM(GMT)執行磁碟清理:

    SELECT cron.schedule('30 2 1,30 * 6,0', 'VACUUM FULL');

指定定時任務名稱

pg_cron現已支援添加定時任務名稱欄位,文法如下:

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

樣本如下:

  • 每周六的10:00 AM(GMT)刪除到期資料:

    SELECT cron.schedule('Delete Expired Data','30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$);
  • 每分鐘執行指定SQL:

    SELECT cron.schedule('Select Per Minute', '* * * * *', 'select 1');
  • 每天的11:00 PM(GMT)對Postgres庫執行VACUUM:

    SELECT cron.schedule('Do Vacuum', '0 23 * * *' , 'VACUUM FULL');

指定定時任務執行資料庫

低於1.4版本的pg_cron外掛程式只能在安裝外掛程式的庫執行定時任務,如果需要在其他庫執行任務,需要直接操作cron.job表,操作不方便且不安全。

1.4版本的pg_cron外掛程式支援指定資料庫和資料庫帳號執行定時任務。文法如下:

SELECT cron.schedule('<定時任務名稱>', '<定時計劃>', '<定時任務>', '<執行資料庫>', '<資料庫帳號>', '<任務是否啟用>');
  • '<執行資料庫>':預設值為空白,表示在postgres庫執行。

  • '<資料庫帳號>:預設值為空白,表示使用當前帳號執行。

  • '<任務是否啟用>':預設值為true,表示啟用該定時任務。

樣本如下:

  • 每天的11:00 PM(GMT)在dw庫執行VACUUM:

    SELECT cron.schedule('Do Vacuum', '0 23 * * *' , 'VACUUM FULL', 'dw');
  • 每分鐘讓gp1234使用者在dw庫中執行指定SQL:

    SELECT cron.schedule('Select Per Minute', '* * * * *', 'select 1', 'dw', 'gp1234');
  • 每天的10:00 AM(GMT)讓user1使用者在dw庫執行函數test:

    SELECT cron.schedule('DO Function', '0 10 * * *', 'select test()', 'dw', 'user1', true);

更改定時任務

pg_cron提供了cron.alter_job函數用於更改定時任務,文法如下:

SELECT cron.alter_job(<定時任務ID>, '<定時計劃>', '<定時任務>', '<執行資料庫>', '<執行使用者>', '<任務是否啟用>');
  • <定時任務ID>:必填。定時任務ID為建立任務時自動產生的,可以通過查看cron.job表的jobid欄位查看。

  • 其他參數:非必填,預設值為空白,表示不更改。

樣本如下:

  • 任務ID為3的定時任務更改為每天11:00 AM(GMT)執行:

    SELECT cron.alter_job(3, '0 11 * * *');
  • 任務ID為1的定時任務更改為VACUUM:

    SELECT cron.alter_job(1, null , 'VACUUM');
  • 任務ID為2的定時任務的執行使用者更改為gp1234:

    SELECT cron.alter_job(2, null , null, null, 'gp1234');

查看定時任務執行資訊

pg_cron新增了cron.job_run_details表記錄定時任務執行資訊,您可以在該表中擷取執行任務的詳細情況。

說明

定時任務較多時,可能會導致cron.job_run_details表變得非常大,建議設定一個定時任務來刪除該表。如果您不需要記錄定時任務的執行情況,也可以提交工單聯絡支援人員修改cron.log_run關閉記錄資訊。

樣本如下:

  • 查看失敗的任務詳情:

    SELECT * FROM cron.job_run_details WHERE status = 'failed';
  • 查看任務ID為1的定時任務執行詳情:

    SELECT * FROM cron.job_run_details WHERE jobid = '1';

查看定時工作清單

樣本如下:

SELECT * FROM cron.job;

刪除定時任務

  • 通過任務名稱刪除定時任務,文法如下:

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

    pg_cron允許建立重複的定時任務名稱,當刪除名稱重複的定時任務時,只會刪除任務ID較小的定時任務。

    樣本如下:

    刪除名為Do Vacuum的定時任務:

    SELECT cron.unschedule('Do Vacuum');
  • 通過定時任務ID刪除定時任務,文法如下:

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

    定時任務ID為建立任務時自動產生的,可以通過查看cron.job表的jobid欄位查看。

    樣本如下:

    刪除定時任務ID為21的定時任務:

    SELECT cron.unschedule(21);

相關文檔