すべてのプロダクト
Search
ドキュメントセンター

PolarDB:pg_cron

最終更新日:Nov 11, 2024

pg_cronは、PolarDB for PostgreSQL でサポートされているサードパーティの拡張機能です。 cron構文を使用して、PolarDB for PostgreSQL でスケジュールどおりにSQL文を実行できます。 SQL文を使用して、指定した時点または時間間隔で自動的に実行されるスケジュール済みタスクを作成できます。 このトピックでは、pg_cron拡張機能の背景情報と動作原理について説明します。 拡張を使用する例も提供されます。

背景情報

スケジュールされたタスクは、指定された時点または時間間隔で自動的に実行されます。 スケジュールされたタスクは通常、指定された時間ルールに基づいてタスクを実行するスケジューラによって管理されます。 スケジューラの時間ルールを設定して、毎日特定の時点、毎週特定の日と時点、または毎月特定の日と時点でタスクを実行できます。 要件に基づいて、特定の時間間隔で特定の回数タスクを実行するようにスケジューラを構成することもできます。

スケジュールされたタスクは、次のシナリオで使用できます。

  • サーバー側では、定期的にバックグラウンドタスクを実行し、レポートを生成し、ジャンクデータを消去するためにスケジュールタスクがよく使用されます。

  • クライアント側では、スケジュールされたタスクを使用してデータを更新し、ユーザーにアラートを送信し、自動操作を実行できます。

サーバー側とクライアント側の両方でスケジュールされたタスクを使用することで、手動操作を削減し、作業効率を向上できます。

pg_cronの拡張機能には、次の利点があります。

  • 使いやすい: SQL文を実行して、タスクを作成、スケジュール、および管理できます。 追加のプログラミングや構成は必要ありません。

  • 柔軟なスケジューリングオプション: 分、時間、日付、週、月、および任意の時間の組み合わせでタスクをスケジュールできます。

  • データベースレベルのタスク管理: スケジュールされたタスクはデータベースに保存され、複数のデータベース間で共有および管理できます。

  • 同時タスク実行: 複数のタスクを同時に実行して、タスクの実行効率を向上させることができます。

  • 信頼性とフォールトトレランス: エラー処理とフォールトトレランスメカニズムが提供され、タスクが正しく実行され、対応するログが生成されます。

pg_cron拡張機能は、データベース管理者と開発者が繰り返しタスクを自動化するためのシンプルで強力なツールです。 たとえば、pg_cronを使用して、データのバックアップ、レポートの生成、および定期的なクリーンアップを実行するタスクを作成できます。 これにより、データベースの管理と開発の効率が向上します。

前提条件

拡張機能は、次のエンジンを実行するPolarDB for PostgreSQLクラスターでサポートされています。

  • PostgreSQL 14 (バージョン14.9.14.0以降)

  • PostgreSQL 11 (バージョン1.1.1以降)

説明

次のいずれかのステートメントを実行して、PolarDB for PostgreSQLクラスターのリビジョンバージョンを表示できます。

  • PostgreSQL 14

    SELECT version();
  • PostgreSQL 11

    SHOW polar_version;

使用上の注意

マイナーエンジンバージョンが 14.10.16.0以前のPolarDB for PostgreSQL クラスターを再起動すると、クラスターポートが変更され、pg_cron拡張機能を使用して作成されたタスクが失敗する可能性があります。 この問題は、マイナーエンジンバージョン 14.10.16.1以降で修正されます。

仕組み

スケジュールされたタスク情報のメンテナンス

image

スケジュールされたタスクはすべて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テーブルとリアルタイムで一致します。 これにより、タスクを正しくスケジュールして実行できるようになります。

スケジュールされたタスクのスケジューリングと実行

image
  • WAITING: デフォルトの状態。 条件が満たされない場合、例えば、タスクがアクティブ化されていないか、またはスケジュールされた時間に達していない場合、タスクのスケジューリングはスキップされます。 条件が満たされると、タスクはSTART状態に入ります。

  • START: タスクの接続情報を確立し、接続テストを実行します。 接続が成功した場合、タスクはCONNECTING状態に入ります。 そうでなければ、タスクはERROR状態に入ります。

  • CONNECTING: タスクがアクティブになっているかどうか、および接続が正常かどうかを確認します。 すべての条件が満たされると、タスクはSENDING状態に入ります。 そうでなければ、タスクはERROR状態に入ります。

  • SENDING: タスクがアクティブ化されているかどうか、および接続が正常かどうかを確認します。 すべての条件が満たされると、スケジュールされたタスクはPolarDB for PostgreSQL サーバーに送信され、RUNNING状態になります。 そうでなければ、タスクはERROR状態に入ります。

  • RUNNING: タスクがアクティブ化されているかどうか、および接続が正常かどうかを確認します。 すべての条件が満たされると、システムは返されたタスク結果を受け取り、タスクは完了状態になります。 そうでない場合、システムは待機を停止し、タスクはERROR状態に入ります。

  • エラー: タスクが失敗しました。 システムは接続情報をリセットします。 タスクが完了状態になります。

  • 完了: タスクは完了です。 タスク情報をリセットします。 タスクは再びWAITING状態に入ります。

関数

説明
  • セキュリティ上の理由から、特権アカウントのみが、cron.jobテーブルに対する操作を実行するために次の関数を呼び出す権限を持っています。 標準アカウントには、cron.jobテーブルに対する表示権限のみがあります。

  • すべてのスケジュール済みタスクはpostgresデータベースに保存されます。 スケジュールされたタスクを管理するには、postgresデータベースに接続する必要があります。

  • スケジュールされたタスクは、グリニッジ標準時 (GMT) に基づいて実行されます。 現地時間をGMTに変換する必要があります。

スケジュール済みタスクの作成

構文

cron.schedule (
    job_name TEXT,
    schedule TEXT,
    command TEXT
);

Parameters

パラメーター

説明

job_name

タスクの名前。 デフォルトでは、このパラメータを空のままにすることができます。

schedule

タスクのスケジュール。 値は標準のcron式です。

コマンド

タスクの内容。 値はSQL文字列です。

指定されたデータベースにスケジュールされたタスクを作成する

構文

cron.schedule_in_database (
    job_name TEXT,
    schedule TEXT,
    command TEXT,
    db_name TEXT
);

Parameters

パラメーター

説明

job_name

タスクの名前。

schedule

タスクのスケジュール。 値は標準のcron式です。

コマンド

タスクの内容。 値はSQL文字列です。

db_name

タスクが実行されるデータベース。

スケジュール済みタスクの変更

構文

cron.alter_job (
    job_id BIGINT,
    schedule TEXT DEFAULT NULL,
    command TEXT DEFAULT NULL,
    db_name TEXT DEFAULT NULL,
    active 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拡張子を作成します。

CREATE EXTENSION pg_cron;

スケジュール済みタスクの作成

次のコマンドを実行して、db01データベース用にtask1という名前のタスクを作成します。 タスクIDが返されます。

SELECT cron.schedule_in_database('task1', '* * * * *', 'SELECT 1', 'db01');

サンプル結果:

 schedule_in_database
----------------------
                    1
(1 row)

スケジュール済みタスクの表示

次のコマンドを実行して、スケジュール済みタスクを表示します。

SELECT * FROM cron.job;

サンプル結果:

jobid | schedule  | command  | nodename | nodeport | database | username | active | jobname
-------+-----------+----------+----------+----------+----------+----------+--------+---------
     1 | * * * * * | SELECT 1 | /tmp     |    39361 | db01     | u1       | t      | task1
(1 row)

スケジュールされたタスクの実行履歴の表示

次のコマンドを実行して、スケジュールされたタスクの実行履歴を表示します。

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 | succeeded | 1 row          | 2023-10-19 03:55:00.020442+00 | 2023-10-19 03:55:00.021512+00
     1 |     2 | 4152438 | db01     | u1       | SELECT 1 | succeeded | 1 row          | 2023-10-19 03:56:00.006468+00 | 2023-10-19 03:56:00.006822+00
(2 rows)

スケジュール済みタスクの削除

次のコマンドを実行して、スケジュール済みタスクを削除します。

SELECT cron.unschedule('task1');

サンプル結果:

 unschedule
------------
 t
(1 row)

pg_cron拡張子の削除

次のコマンドを実行して、pg_cron拡張子を削除します。

DROP EXTENSION pg_cron;

時間ルールの例

pg_cron拡張機能は、標準のcron構文を使用します。 * は、タスクが指定された時間間隔で実行されることを示します。 指定された数字は、2つの連続した実行間の期間を示します。

┌───────────── Minute (0 to 59)
 │ ┌────────────── Hour (0 to 23)
 │ │ ┌─────────────── Date (1 to 31)
 │ │ │ ┌──────────────── Month (1 to 12)
 │ │ │ │ ┌───────────────── Day of the week (0 to 6). The value 0 indicates Sunday. The value 6 indicates next Saturday. 
 │ │ │ │ │                  The value 7 also indicates Sunday.
 * * * * *
  • 毎週土曜日のGMT 03:30に期限切れのデータを削除します。

    SELECT cron.schedule('30 3 * * 6', $$DELETE FROM events 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;');