このトピックでは、pg_cron拡張機能の背景情報と動作原理について説明します。 拡張を使用する例も提供される。
背景情報
スケジュールされたタスクは、指定された時点または時間間隔で自動的に実行されます。 スケジュールされたタスクは通常、指定された時間ルールに基づいてタスクを実行するスケジューラによって管理されます。 スケジューラの時間ルールを設定して、毎日特定の時点、毎週特定の日と時点、または毎月特定の日と時点でタスクを実行できます。 要件に基づいて、特定の時間間隔で特定の回数タスクを実行するようにスケジューラを構成することもできます。
スケジュールされたタスクは、次のシナリオで使用できます。
サーバー側では、定期的にバックグラウンドタスクを実行し、レポートを生成し、ジャンクデータを消去するためにスケジュールタスクがよく使用されます。
クライアント側では、スケジュールされたタスクを使用してデータを更新し、ユーザーにアラートを送信し、自動操作を実行できます。
サーバー側とクライアント側の両方でスケジュールされたタスクを使用することで、手動操作を削減し、作業効率を向上できます。
pg_cron
は、 でサポートされているサードパーティの拡張機能です。 cron構文を使用して、 でスケジュールどおりにSQL文を実行できます。 SQL文を使用して、指定した時点または時間間隔で自動的に実行されるスケジュール済みタスクを作成できます。
pg_cron
の拡張機能には、次の利点があります。
使いやすい: SQL文を実行して、タスクを作成、スケジュール、および管理できます。 追加のプログラミングや構成は必要ありません。
柔軟なスケジューリングオプション: 分、時間、日付、週、月、および任意の時間の組み合わせでタスクをスケジュールできます。
データベースレベルのタスク管理: スケジュールされたタスクはデータベースに保存され、複数のデータベース間で共有および管理できます。
同時タスク実行: 複数のタスクを同時に実行して、タスクの実行効率を向上させることができます。
信頼性とフォールトトレランス: エラー処理とフォールトトレランスメカニズムが提供され、タスクが正しく実行され、対応するログが生成されます。
pg_cron
拡張機能は、データベース管理者と開発者が繰り返しタスクを自動化するためのシンプルで強力なツールです。 たとえば、pg_cronを使用して、データのバックアップ、レポートの生成、および定期的なクリーンアップを実行するタスクを作成できます。 これにより、データベースの管理と開発の効率が向上します。
使用上の注意
マイナーエンジンバージョンが2.0.14.16.1以前のクラスターを再起動すると、クラスターポートが変更され、pg_cron拡張機能を使用して作成されたタスクが失敗する可能性があります。 この問題は、PolarDB for Oracleマイナーエンジンバージョン2.0.14.16.1以降で修正されています。
仕組み
スケジュールされたタスク情報のメンテナンス
スケジュールされたタスクはすべてcron.job
テーブルに保存されます。 SQL関数を呼び出すことで、スケジュールされたタスクを作成または削除できます。
pg_cron
拡張は、バックグラウンドスケジューリングおよびタスク実行のためにJOB_LISTおよびTASK_LISTリストを維持する。 データベースが起動すると、cron. JOB
テーブルのタスクリストに基づいてjob LISTとTASK LISTが作成されます。 タスクリストが後で更新された場合、cron.job_cache_invalidate
トリガーによってリストが更新され、JOB listおよびtask LISTがcron.job
テーブルとリアルタイムで一致します。 これにより、タスクを正しくスケジュールして実行できるようになります。
スケジュールされたタスクのスケジューリングと実行
WAITING: デフォルトの状態。 条件が満たされない場合、例えば、タスクがアクティブ化されていないか、またはスケジュールされた時間に達していない場合、タスクのスケジューリングはスキップされる。 条件が満たされると、タスクはSTART状態に入る。
START: タスクの接続情報を確立し、接続テストを実行します。 接続が成功した場合、タスクはCONNECTING状態に入ります。 そうでなければ、タスクはERROR状態に入る。
CONNECTING: タスクがアクティブになっているかどうか、および接続が正常かどうかを確認します。 すべての条件が満たされると、タスクはSENDING状態に入ります。 そうでなければ、タスクはERROR状態に入る。
SENDING: タスクがアクティブ化されているかどうか、および接続が正常かどうかを確認します。 すべての条件が満たされると、スケジュールされたタスクはサーバーに送信され、RUNNING状態になります。 そうでなければ、タスクはERROR状態に入る。
RUNNING: タスクがアクティブ化されているかどうか、および接続が正常かどうかを確認します。 すべての条件が満たされると、システムは返されたタスク結果を受け取り、タスクは完了状態になります。 そうでない場合、システムは待機を停止し、タスクはERROR状態に入る。
エラー: タスクが失敗しました。 システムは接続情報をリセットします。 タスクが完了状態になります。
完了: タスクは完了です。 タスク情報をリセットします。 タスクは再びWAITING状態に入ります。
関数
セキュリティ上の理由から、特権アカウントのみが、
cron.job
テーブルに対する操作を実行するために次の関数を呼び出す権限を持っています。 標準アカウントには、cron.job
テーブルに対する表示権限のみがあります。すべてのスケジュール済みタスクは
postgres
データベースに保存されます。 スケジュールされたタスクを管理するには、postgres
データベースに接続する必要があります。スケジュールされたタスクは、グリニッジ標準時 (GMT) に基づいて実行されます。 現地時間をGMTに変換する必要があります。
スケジュール済みタスクの作成
構文
cron.schedule (cron.schedule)
job_nameテキスト、
スケジュールテキスト、
コマンドTEXT
);
Parameters
パラメーター | 説明 |
job_name | タスクの名前。 デフォルトでは、このパラメータを空のままにすることができます。 |
schedule | タスクのスケジュール。 値は標準の |
コマンド | タスクの内容。 値は |
指定されたデータベースにスケジュールされたタスクを作成する
構文
cron.schedule_in_database (
job_nameテキスト、
スケジュールテキスト、
コマンドTEXT,
db_nameテキスト
);
Parameters
パラメーター | 説明 |
job_name | タスクの名前。 |
schedule | タスクのスケジュール。 値は標準の |
コマンド | タスクの内容。 値は |
db_name | タスクが実行されるデータベース。 |
スケジュール済みタスクの変更
構文
cron.alter_job (
job_id BIGINT、
スケジュールテキストDEFAULT NULL、
コマンドTEXT DEFAULT NULL,
db_name TEXT DEFAULT NULL、
アクティブなBOOLEAN DEFAULT NULL
);
Parameters
パラメーター | 説明 |
job_id | 変更するタスクのID。 |
schedule | タスクの変更されたスケジュール。 |
コマンド | タスクの変更された内容。 |
db_name | タスクを変更した後にタスクが実行されるデータベース。 |
active | タスクがアクティブ化され、変更後に実行できるかどうか。 |
スケジュール済みタスクの削除
構文
cron.unschedule(job_id BIGINT);
cron.unschedule(job_name TEXT);
Parameters
パラメーター | 説明 |
job_id | 削除するタスクのID。 |
name | 削除するタスクの名前。 |
使用法
セキュリティ上の理由から、次の操作は特権ユーザーとしてのみ実行できます。
pg_cron拡張子の作成
データベースに接続し、次のコマンドを実行してpg_cron
拡張子を作成します。
拡張の作成pg_cron;
スケジュール済みタスクの作成
次のコマンドを実行して、db01
データベース用にtask1
という名前のタスクを作成します。 タスクIDが返されます。
SELECT cron.schedule_in_database('task1', '* * * *', 'SELECT 1 ', 'db01);
サンプル結果:
schedule_in_database
----------------------
1
(1行)
スケジュール済みタスクの表示
次のコマンドを実行して、スケジュール済みタスクを表示します。
SELECT * からcron.job;
サンプル結果:
jobid | スケジュール | コマンド | nodename | nodeport | database | username | active | jobname
------ ----------- ------------------------------------------------------------------------------
1 | * * * * * | SELECT 1 | /tmp | 39361 | db01 | u1 | t | task1
(1行)
スケジュールされたタスクの実行履歴の表示
次のコマンドを実行して、スケジュールされたタスクの実行履歴を表示します。
SELECT * FROM cron.job_run_details;
サンプル結果:
jobid | runid | job_pid | database | username | command | status | return_message | start_time | end_time
------- -------- ------------------ ---------------------------------------------- ---------------- + -------------------------------
1 | 1 | 4152316 | db01 | u1 | SELECT 1 | 成功 | 1行 | 2023-10-19 03:55:00.020442 + 00 | 2023-10-19 03:55:00.021512 + 00
1 | 2 | 4152438 | db01 | u1 | SELECT 1 | 成功 | 1行 | 2023-10-19 03:56:00.006468 + 00 | 2023-10-19 03:56:00.006822 + 00
(2行)
スケジュール済みタスクの削除
次のコマンドを実行して、スケジュール済みタスクを削除します。
SELECT cron.unschedule('task1');
サンプル結果:
スケジュール解除
------------
t
(1行)
pg_cron拡張子の削除
次のコマンドを実行して、pg_cron
拡張子を削除します。
ドロップ延長pg_cron;
時間ルールの例
pg_cron
拡張機能は、標準のcron構文を使用します。 *
は、タスクが指定された時間間隔で実行されることを示します。 指定された数字は、2つの連続した実行間の期間を示します。
「 ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ 分 (0〜59)
│ ┌────────────── 时间 (0 ~ 23)
│ │ ┌─────────────── 日付 (1 ~ 31)
│ │ │ Month月 (1 ~ 12)
│ │ │ │ week周の日 (0〜6) 。 値0は日曜日を示す。 値6は次の土曜日を示す。
│ │ │ │ value値7は日曜日も示します。
* * * * *
毎週土曜日のGMT 03:30に期限切れのデータを削除します。
SELECT cron.schedule('30 3 * * 6 '、$$DELETE WHERE event_time < now() - interval '1 week'$$$);
毎日GMT 10:00に
VACUUM
を実行します。SELECT cron.schedule('0 10 * * * ', 'VACUUM;');
指定されたSQL文を1分ごとに実行します。
SELECT cron.schedule('* * * *', 'SELECT 1;');
各時間の23分に、指定したSQL文を実行します。
SELECT cron.schedule('23 * * * * ', 'SELECT 1;');
毎月4日に指定したSQL文を実行します。
SELECT cron.schedule('* * 4 * *', 'SELECT 1;');