pg_cron は、PostgreSQL 9.5 以降向けの cron ベースのジョブスケジューラであり、拡張機能としてデータベース内で直接実行されます。標準の cron 式の構文を使用するため、ルーチンの VACUUM 実行からカスタムデータアーカイブクエリまで、外部スケジューラなしで任意の SQL コマンドをスケジュールできます。
pg_cron を使用する前に、カーネルを V1.1.19 以降にアップグレードしてください。以前のバージョンには、既知のメモリリークリスクがあります。
前提条件
開始する前に、以下を確認してください。
PolarDB for PostgreSQL クラスターがカーネル V1.1.19 以降で実行されていること
pg_cron の有効化
pg_cron はデフォルトで無効化されています。有効にするには、クォータセンターを通じてアクセスを申請してください。
クォータセンターにアクセスします。
クォータリストで polardb_pg_pg_cron を見つけます。
「操作」列の[適用]をクリックします。
CREATE EXTENSION を使用して手動で有効にすることはできません。
注意事項
スケジュールされたジョブは GMT で実行されます。
すべてのジョブはデフォルトの PostgreSQL データベースに保存されますが、任意のデータベースからクエリできます。
セキュリティ上の考慮事項から、システム関数を使用することによってのみ定期タスクを実行できます。システムでは定期タスクの追加と削除が可能です。一般ユーザーは、
cron.jobテーブル内の定期タスクのみを表示できます。
ジョブのスケジュール
各スケジュールされたジョブには、2つのコンポーネントがあります。それは、実行タイミングを定義する cron 式と、実行する SQL コマンドです。
-- デフォルトの PostgreSQL データベースでジョブをスケジュールする
SELECT cron.schedule('<cron-expression>', '<sql-command>');
-- 特定のデータベースでジョブをスケジュールする
SELECT cron.schedule('<cron-expression>', '<sql-command>', '<database-name>');データベースパラメーターを省略した場合、デフォルトの PostgreSQL データベースが使用されます。
cron.schedule() は、後でジョブを管理するために使用する数値の jobid を返します。
cron 式の構文
cron 式には、5つのスペース区切りのフィールドがあります。
┌─────────────── 分 (0–59)
│ ┌───────────── 時 (0–23)
│ │ ┌─────────── 日 (月) (1–31)
│ │ │ ┌───────── 月 (1–12)
│ │ │ │ ┌─────── 曜日 (0–6、0 は日曜日、7 は引き続き週末の日を示す)
│ │ │ │ │
* * * * *特殊文字:
| 文字 | 意味 | 例 |
|---|---|---|
* | フィールド内のすべての値 | * * * * * は毎分実行されます |
例
毎週土曜日に古いデータをパージする
-- 毎週土曜日の GMT 3:30 に 1 週間以上前のイベントを削除する
SELECT cron.schedule('30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$);出力:
schedule
----------
42毎日 VACUUM を実行する
-- 毎日 GMT 10:00 に VACUUM を実行する
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ジョブの管理
スケジュールされたジョブの表示
SELECT * FROM cron.job;出力例:
jobid | schedule | command | nodename | nodeport | database | username | active
-------+-------------+-----------+-----------+----------+----------+----------+--------
43 | 0 10 * * * | VACUUM; | localhost | 5433 | postgres | test | tジョブの削除
-- jobid 42 のジョブを削除する
SELECT cron.unschedule(42);出力:
unschedule
------------
tpg_cron の無効化
拡張機能を無効にするには、以下を実行します。
DROP EXTENSION pg_cron;