RDS PostgreSQL支持pg_cron定時任務插件。該插件基于cron的作業調度,語法與常規cron相同,您可以通過相應的SQL命令直接在數據庫中配置定時任務。
您可以加入RDS PostgreSQL插件交流釘釘群(103525002795),進行咨詢、交流和反饋,獲取更多關于插件的信息。
功能簡介
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;
說明僅高權限賬號可以執行此命令。